Description

给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是多少(1≤k≤j-i+1),并且,你可以改变一些a[i]的值,改变后,程序还能针对改变后的a继续回答上面的问题。你需要编一个这样的程序,从输入文件中读入序列a,然后读入一系列的指令,包括询问指令和修改指令。对于每一个询问指令,你必须输出正确的回答。 第一行有两个正整数n(1≤n≤10000),m(1≤m≤10000)。分别表示序列的长度和指令的个数。第二行有n个数,表示a[1],a[2]……a[n],这些数都小于10^9。接下来的m行描述每条指令,每行的格式是下面两种格式中的一种。 Q i j k 或者 C i t Q i j k (i,j,k是数字,1≤i≤j≤n, 1≤k≤j-i+1)表示询问指令,询问a[i],a[i+1]……a[j]中第k小的数。C i t (1≤i≤n,0≤t≤10^9)表示把a[i]改变成为t。

Input

对于每一次询问,你都需要输出他的答案,每一个输出占单独的一行。

Output

 

Sample Input

5 3
3 2 1 4 7
Q 1 4 3
C 2 6
Q 2 5 3

Sample Output

3
6

HINT

20%的数据中,m,n≤100; 40%的数据中,m,n≤1000; 100%的数据中,m,n≤10000。

Source

依旧是模板,树状数组套主席树比较神奇,每个树状数组做一颗主席树,感觉树状数组学得不好啊。。。将时间提高到了nlog2n,注意离线的写法。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. using namespace std;
  5. int sum[],ls[],rs[],root[],A[],B[],C[],num[],hash[],v[],L[],R[],flag[];
  6. int n,m,nt,numt,sz,a,b;
  7. int lowbit(int x){return x&(-x);}
  8.  
  9. int find(int x)
  10. {
  11. int l=,r=nt,mid;
  12. while (l<=r)
  13. {
  14. mid=(l+r)>>;
  15. if (hash[mid]<x) l=mid+;
  16. else r=mid-;
  17. }
  18. return l;
  19. }
  20.  
  21. void updata(int l,int r,int x,int &y,int p,int w)
  22. {
  23. y=++sz;
  24. sum[y]=sum[x]+w;
  25. ls[y]=ls[x]; rs[y]=rs[x];
  26. if (l==r) return;
  27. int mid=(l+r)>>;
  28. if (p<=mid) updata(l,mid,ls[x],ls[y],p,w);
  29. else updata(mid+,r,rs[x],rs[y],p,w);
  30. }
  31.  
  32. int query(int l,int r,int k)
  33. {
  34. if (l==r) return l;
  35. int suml=,sumr=;
  36. for (int i=;i<=a;i++) suml+=sum[ls[L[i]]];
  37. for (int i=;i<=b;i++) sumr+=sum[ls[R[i]]];
  38. int mid=(l+r)>>;
  39. if (sumr-suml>=k)
  40. {
  41. for (int i=;i<=a;i++) L[i]=ls[L[i]];
  42. for (int i=;i<=b;i++) R[i]=ls[R[i]];
  43. return query(l,mid,k);
  44. }
  45. else
  46. {
  47. for (int i=;i<=a;i++) L[i]=rs[L[i]];
  48. for (int i=;i<=b;i++) R[i]=rs[R[i]];
  49. return query(mid+,r,k-(sumr-suml));
  50. }
  51. }
  52.  
  53. int main()
  54. {
  55. scanf("%d%d",&n,&m);
  56. for (int i=;i<=n;i++)
  57. {
  58. scanf("%d",&v[i]);
  59. num[++numt]=v[i];
  60. }
  61. for (int i=;i<=m;i++)
  62. {
  63. char s[];
  64. scanf("%s",s);
  65. scanf("%d%d",&A[i],&B[i]);
  66. if (s[]=='Q') {scanf("%d",&C[i]);flag[i]=;}
  67. else num[++numt]=B[i];
  68. }
  69. sort(num+,num+numt+);
  70. hash[++nt]=num[];
  71. for (int i=;i<=numt;i++)
  72. if (num[i]!=num[i-])
  73. hash[++nt]=num[i];
  74. for (int i=;i<=n;i++)
  75. {
  76. int t=find(v[i]);
  77. for (int j=i;j<=n;j+=lowbit(j)) updata(,nt,root[j],root[j],t,);
  78. }
  79. for (int i=;i<=m;i++)
  80. {
  81. if (flag[i])
  82. {
  83. a=,b=;
  84. int xx;
  85. A[i]--;
  86. for (int j=A[i];j>=;j-=lowbit(j)) L[++a]=root[j];
  87. for (int j=B[i];j>=;j-=lowbit(j)) R[++b]=root[j];
  88. xx=query(,nt,C[i]);
  89. printf("%d\n",hash[xx]);
  90. }
  91. else
  92. {
  93. int t=find(v[A[i]]);
  94. for (int j=A[i];j<=n;j+=lowbit(j)) updata(,nt,root[j],root[j],t,-);
  95. v[A[i]]=B[i];
  96. t=find(B[i]);
  97. for (int j=A[i];j<=n;j+=lowbit(j)) updata(,nt,root[j],root[j],t,);
  98. }
  99. }
  100. return ;
  101. }

【BZOJ1901】Zju2112 Dynamic Rankings的更多相关文章

  1. 【BZOJ1901】Zju2112 Dynamic Rankings 主席树+树状数组

    [BZOJ1901]Zju2112 Dynamic Rankings Description 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j ...

  2. 【BZOJ1901】 Zju2112 Dynamic Rankings(树套树)

    [题意] 给定一个含有n个数的序列a[1],a[2],a[3]--a[n], 程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[j]中第k小的数是多少(1≤k ...

  3. 【bzoj1901】Zju2112 Dynamic Rankings 离散化+主席树+树状数组

    题目描述 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是多少(1≤k≤ ...

  4. 【BOZJ 1901】Zju2112 Dynamic Rankings

    Description 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是 ...

  5. 【bzoj 1901】Zju2112 Dynamic Rankings

    Description 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是 ...

  6. 【BZOJ 1901】Zju2112 Dynamic Rankings &&【COGS 257】动态排名系统 树状数组套线段树

    外面是树状数组,里面是动态开点线段树,对于查询我们先把有关点找出来,然后一起在线段树上行走,这样就是单个O(log2)的了 #include <cstdio> #include <v ...

  7. 【ZOJ】2112 Dynamic Rankings

    树状数组套主席树模板题目. /* 2112 */ #include <iostream> #include <sstream> #include <string> ...

  8. bzoj1901:Zju2112 Dynamic Rankings

    思路:树套树,我写了两种,一种是线段树套splay,线段树维护区间信息,splay维护第k大,一种是树状数组套权值线段树(并不是什么可持久化线段树,只不过是动态开点罢了,为什么网上一大堆题解都是可持久 ...

  9. BZOJ1901:Zju2112 Dynamic Rankings——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1901 Description 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序 ...

随机推荐

  1. HTML+CSS页面滚动效果处理

    HTML+CSS代码如下: <!doctype html> <html> <head> <meta charset="utf-8"> ...

  2. SQL Server 2014 BI新特性(一)五个关键点带你了解Excel下的Data Explorer

    Data Explorer是即将发布的SQL Server 2014里的一个新特性,借助这个特性讲使企业中的自助式的商业智能变得更加的灵活,从而也降低了商业智能的门槛. 此文是在微软商业智能官方博客里 ...

  3. 微软改名部再次大显神威——ASP.NET 5改名ASP.NET Core 1.0

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:在计算机科学领域只有两件难事:缓存不可用和命名.--Phil Karlton 今天,S ...

  4. h264 profile & level

    转自:http://blog.csdn.net/sphone89/article/details/17492433 H.264 Profiles H.264有四种profile,每个profile支持 ...

  5. Java Data Type

    官方文档:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html 转载地址:http://blog.csdn.n ...

  6. Sizeof运算符小结

    以下内容援引自<C Primer Plus>中文版第五版Page95 Sizeof运算符以字节为单位返回其操作数的大小.(在C中,1个字节被定义为char类型所占用空间的大小.在过去,1个 ...

  7. C#中var和dynamic

    var与dynamic这两个关键字,只是看起来很相似,仅此而已!var表示“变量的类型是在编译时决定的”,但是dynamic表 示“变量的类型是在运行时决定的”.因此,dynamic与var具有截然不 ...

  8. 用C#基于WCF创建TCP的Service供Client端调用

    本文将详细讲解用C#基于WCF创建TCP的Service供Client端调用的详细过程 1):首先创建一个Windows Service的工程 2):生成的代码工程结构如下所示 3):我们将Servi ...

  9. java中的三种取整函数

        舍掉小数取整:Math.floor(3.5)=3 四舍五入取整:Math.rint(3.5)=4 进位取整:Math.ceil(3.1)=4

  10. 如何通过java代码对kylin进行cube build

    通常是用于增量 代码如下: package com.dlht.kylinDemo; import java.io.BufferedReader; import java.io.FileNotFound ...