POJ 2104 K-th Number(主席树求静态区间第k大)

http://poj.org/problem?id=2104

主席树裸题没什么好说的,学主席树请看上一篇博客

 1 #include
 2 #include
 3 #include
 4 using namespace std;
 5 const int N=1e5+5;
 6 int T;
 7 int n,q;
 8 int a[N],b[N],rt[N],ls[N*32],rs[N*32],sum[N*32];
 9 int cnt,ans;
10 void up(int &o,int pre,int l,int r,int p){
11     o=++cnt;
12     ls[o]=ls[pre];
13     rs[o]=rs[pre];
14     sum[o]=sum[pre]+1;
15     if(l==r)return;
16     int m=(l+r)/2;
17     if(p<=m)up(ls[o],ls[pre],l,m,p);
18     else up(rs[o],rs[pre],m+1,r,p);
19 }
20 int qu(int o,int pre,int l,int r,int k){
21     int g=sum[ls[o]]-sum[ls[pre]];
22     if(l==r)return l;
23     int m=(l+r)/2;
24     if(k<=g)return qu(ls[o],ls[pre],l,m,k);
25     return qu(rs[o],rs[pre],m+1,r,k-g);
26 }
27 int h=1e5+5;
28 int main(){
29     scanf("%d%d",&n,&q);
30     for(int i=1;i<=n;i++){
31         scanf("%d",&a[i]);
32         b[i]=a[i];
33     }
34     sort(b+1,b+1+n);
35     for(int i=1;i<=n;i++){
36         a[i]=lower_bound(b+1,b+1+n,a[i])-b;
37     }
38     for(int i=1;i<=n;i++){
39         up(rt[i],rt[i-1],1,h,a[i]);
40     }
41     while(q--){
42         int ql,qr,k;
43         scanf("%d%d%d",&ql,&qr,&k);
44         int id=qu(rt[qr],rt[ql-1],1,h,k);
45         printf("%d\n",b[id]);
46     }
47 }
48 /*
49 7 3
50 1 5 2 6 3 7 4
51 2 5 3
52 4 4 1
53 1 7 3
54 */

 

你可能感兴趣的:(POJ 2104 K-th Number(主席树求静态区间第k大))