1. 程式人生 > >主席樹模板

主席樹模板

else har body 內存 fin AC div 區間第k大 cstring

這裏沒有思想,沒有光,沒有熱,只有寒冷和永無止境的黑暗。

還有.赤裸裸的主席樹代碼(求區間第K大)

註意保險起見內存開30倍

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<queue>
 6 #include<cstring>
 7 #include<string>
 8 #include<map>
 9 #define ll long long
10 #define
DB double 11 #define eps 1e-3 12 #define inf 2147483647 13 #define mod 100000007 14 using namespace std; 15 inline int read() 16 { 17 int x=0,w=1;char ch=getchar(); 18 while(!isdigit(ch)){if(ch==-) w=-1;ch=getchar();} 19 while(isdigit(ch)) x=(x<<3)+(x<<1)+ch-0,ch=getchar(); 20 return
x*w; 21 } 22 const int N=2e5+10; 23 int n,Q,k; 24 int cnt,a[N],b[N],ls[N*30],rs[N*30],sum[N*30]; 25 int rt[N*30]; 26 void add(int &nw,int last,int l,int r,int p) 27 { 28 nw=++cnt; 29 ls[nw]=ls[last];rs[nw]=rs[last]; 30 sum[nw]=sum[last]+1; 31 if(l==r) return; 32 int mid=(l+r)>>1
; 33 if(p<=mid) add(ls[nw],ls[last],l,mid,p); 34 else add(rs[nw],rs[last],mid+1,r,p); 35 } 36 int query(int x,int y,int l,int r,int k) 37 { 38 if(l==r) return l; 39 int mid=(l+r)>>1; 40 int u=sum[ls[y]]-sum[ls[x]]; 41 if(k<=u) return query(ls[x],ls[y],l,mid,k); 42 else return query(rs[x],rs[y],mid+1,r,k-u); 43 } 44 int main() 45 { 46 n=read();Q=read(); 47 for(int i=1;i<=n;++i) a[i]=read(),b[i]=a[i]; 48 sort(b+1,b+n+1); 49 k=unique(b+1,b+n+1)-b-1; 50 for(int i=1;i<=n;++i) 51 a[i]=lower_bound(b+1,b+k+1,a[i])-b; 52 for(int i=1;i<=n;++i) 53 add(rt[i],rt[i-1],1,k,a[i]); 54 while(Q--) 55 { 56 int l,r,x;l=read();r=read();x=read(); 57 int pos=query(rt[l-1],rt[r],1,k,x); 58 printf("%d\n",b[pos]); 59 } 60 return 0; 61 }

…φ(?????)? 學習是我的全部

主席樹模板