主席树模板
这里没有思想,没有光,没有热,只有寒冷和永无止境的黑暗。
还有.赤裸裸的主席树代码(求区间第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 }
…φ(๑˃∀˂๑)♪ 学习是我的全部