其他分享
首页 > 其他分享> > 【模板】主席树

【模板】主席树

作者:互联网

 

 

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=200011,M=N<<5;
 4 int n,m,a[N],b[N],num,tot,rt[N];
 5 int cnt[M],ch[M][2];
 6 
 7 inline int re_ad() {
 8     char ch=getchar(); int x=0,f=1;
 9     while(ch<'0' || ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
10     while('0'<=ch && ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
11     return x*f;
12 }
13 
14 inline void pushup(int d) {
15     cnt[d]=cnt[ch[d][0]]+cnt[ch[d][1]];
16 }
17 
18 int build(int l,int r) {
19     int d=++tot;
20     if(l==r) return d;
21     int mid=(l+r)>>1;
22     ch[d][0]=build(l,mid);
23     ch[d][1]=build(mid+1,r);
24     return d;
25 }
26 
27 int update(int p,int l,int r,int k) {
28     int d=++tot;
29     if(l==r) {
30         cnt[d]=cnt[p]+1;
31         return d;
32     }
33     int mid=(l+r)>>1;
34     ch[d][0]=ch[p][0],ch[d][1]=ch[p][1];
35     if(k<=mid) ch[d][0]=update(ch[p][0],l,mid,k);
36     else ch[d][1]=update(ch[p][1],mid+1,r,k);
37     pushup(d);
38     return d;
39 }
40 
41 int query(int p,int d,int l,int r,int k) {
42     if(l==r) return l;
43     int cur=cnt[ch[d][0]]-cnt[ch[p][0]];
44     int mid=(l+r)>>1;
45     if(cur>=k) return query(ch[p][0],ch[d][0],l,mid,k);
46     else return query(ch[p][1],ch[d][1],mid+1,r,k-cur);
47 }
48 
49 int main()
50 {
51     int x,y,z,k;
52     n=re_ad(),m=re_ad();
53     for(int i=1;i<=n;++i) b[i]=a[i]=re_ad();
54     sort(b+1,b+n+1);
55     num=unique(b+1,b+n+1)-b-1;
56     for(int i=1;i<=n;++i) a[i]=lower_bound(b+1,b+num+1,a[i])-b;
57     rt[0]=build(1,num);
58     for(int i=1;i<=n;++i) rt[i]=update(rt[i-1],1,num,a[i]);
59     for(int i=1;i<=m;++i) {
60         x=re_ad(),y=re_ad(),k=re_ad();
61         z=query(rt[x-1],rt[y],1,num,k);
62         printf("%d\n",b[z]);
63     }
64     return 0;
65 }

 

标签:ch,return,ad,int,mid,模板,query,主席
来源: https://www.cnblogs.com/shangguanshufang/p/mo_ban_zhu_xi_shu.html