poj2104 K-th Number

传送门

题解

话说……这完全就是个板子吧啊喂……

不过更好奇的是为什么我第一次交竟然会WA???

不知道主席树是什么的可以看看这篇文章

 1 //minamoto
 2 #include<bits/stdc++.h>
 3 #define N 100005
 4 using namespace std;
 5 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
 6 char buf[1<<21],*p1=buf,*p2=buf;
 7 inline int read(){
 8     #define num ch-'0'
 9     char ch;bool flag=0;int res;
10     while(!isdigit(ch=getc()))
11     (ch=='-')&&(flag=true);
12     for(res=num;isdigit(ch=getc());res=res*10+num);
13     (flag)&&(res=-res);
14     #undef num
15     return res;
16 }
17 int sum[N<<5],L[N<<5],R[N<<5];
18 int a[N],b[N],rt[N];
19 int n,q,m,cnt=0;
20 void update(int last,int &now,int l,int r,int x){
21     sum[now=++cnt]=sum[last]+1;
22     if(l==r) return;
23     int mid=(l+r)>>1;
24     if(x<=mid) R[now]=R[last],update(L[last],L[now],l,mid,x);
25     else L[now]=L[last],update(R[last],R[now],mid+1,r,x);
26 }
27 int query(int u,int v,int l,int r,int k){
28     if(l>=r) return l;
29     int x=sum[L[v]]-sum[L[u]];
30     int mid=(l+r)>>1;
31     if(x>=k) return query(L[u],L[v],l,mid,k);
32     else return query(R[u],R[v],mid+1,r,k-x);
33 }
34 int main(){
35     //freopen("testdata.in","r",stdin);
36     n=read(),q=read();
37     for(int i=1;i<=n;++i)
38     b[i]=a[i]=read();
39     sort(b+1,b+1+n);
40     m=unique(b+1,b+1+n)-b-1;
41     for(int i=1;i<=n;++i){
42         int k=lower_bound(b+1,b+1+m,a[i])-b;
43         update(rt[i-1],rt[i],1,m,k);
44     }
45     while(q--){
46         int x,y,z;
47         x=read(),y=read(),z=read();
48         int k=query(rt[x-1],rt[y],1,m,z);
49         printf("%d\n",b[k]);
50     }
51     return 0;
52 }

猜你喜欢

转载自www.cnblogs.com/bztMinamoto/p/9392282.html