标签:each lang mem logs line following clu tab return
Time Limit: 20000MS | Memory Limit: 65536K | |
Total Submissions: 52338 | Accepted: 17981 | |
Case Time Limit: 2000MS |
Description
Input
Output
Sample Input
7 3 1 5 2 6 3 7 4 2 5 3 4 4 1 1 7 3
Sample Output
5 6 3
Hint
Source
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 #define maxn 100005 6 #define maxm 10000010 7 using namespace std; 8 int root[maxn],ls[maxm],rs[maxm],cnt[maxm],tot; 9 int sz[maxn],hash[maxn]; 10 void build(int &cur,int l,int r){ 11 cur=tot++;cnt[cur]=0; 12 if(l!=r){ 13 int mid=(l+r)/2; 14 build(ls[cur],l,mid); 15 build(rs[cur],mid+1,r); 16 } 17 } 18 void update(int pre,int ps,int &cur,int l,int r){ 19 cur=tot++;cnt[cur]=cnt[pre]+1; 20 ls[cur]=ls[pre];rs[cur]=rs[pre]; 21 if(l==r) return ; 22 int mid=(l+r)/2; 23 if(ps<=mid) update(ls[pre],ps,ls[cur],l,mid); 24 else update(rs[pre],ps,rs[cur],mid+1,r); 25 } 26 int query(int lt,int rt,int l,int r,int k){ 27 if(l==r) return l; 28 int mid=(l+r)/2,cha=cnt[ls[rt]]-cnt[ls[lt]]; 29 if(k<=cha) return query(ls[lt],ls[rt],l,mid,k); 30 else return query(rs[lt],rs[rt],mid+1,r,k-cha); 31 } 32 int main() 33 { 34 int n,m,k,l,r; 35 while(scanf("%d%d",&n,&m)==2){ 36 for(int i=1;i<=n;i++){ 37 scanf("%d",sz+i); 38 hash[i]=sz[i]; 39 } 40 sort(hash+1,hash+n+1); 41 int siz=unique(hash+1,hash+n+1)-hash-1; 42 for(int i=1;i<=n;i++) 43 sz[i]=lower_bound(hash+1,hash+1+siz,sz[i])-hash; 44 tot=0; 45 build(root[0],1,siz); 46 for(int i=1;i<=n;i++) 47 update(root[i-1],sz[i],root[i],1,siz); 48 while(m--){ 49 scanf("%d%d%d",&l,&r,&k); 50 printf("%d\n",hash[query(root[l-1],root[r],1,siz,k)]); 51 } 52 } 53 return 0; 54 }
主席树 模板题
标签:each lang mem logs line following clu tab return
原文地址:http://www.cnblogs.com/suishiguang/p/6293015.html