Example: poj2104 http://poj.org/problem?id=2104
Explanation: http://blog.sina.com.cn/s/blog_6022c4720102w03t.html
Http://seter.is-programmer.com/posts/31907.html
Just based on the above 2 blog read, not yet to write the level of interpretation
#include <cstdio>#include<algorithm>using namespacestd;Const intn=100001;intl_child[n* -],r_child[n* -],sum[n* -];intN,m,a[n],hash[n],cnt,root[n];intx,y,k;voiddiscrete () {sort (hash+1, hash+n+1); CNT=unique (hash+1, hash+n+1)-(hash+1); for(intI=1; i<=n;i++) A[i]=lower_bound (hash+1, hash+cnt+1, A[i])-Hash;}intinit () {intx=0, f=1;CharC=GetChar (); while(c<'0'|| C>'9') {if(c=='-') f=-1; c=GetChar ();} while(c>='0'&&c<='9') {x=x*Ten+c-'0'; c=GetChar ();} returnx*F;}intQueryintXintYintLintRintk) { if(L==R)returnl; intMid=l+r>>1, tmp=sum[l_child[y]]-Sum[l_child[x]]; if(tmp>=k)returnquery (L_CHILD[X],L_CHILD[Y],L,MID,K); Else returnQuery (r_child[x],r_child[y],mid+1, r,k-tmp);}inttot=0;voidBuildintXint&y,intLintRintv) {Sum[y=++tot]=sum[x]+1; if(L==R)return; intMid=l+r>>1; if(v<=mid) {R_child[y]=R_child[x]; Build (L_CHILD[X],L_CHILD[Y],L,MID,V); } Else{L_child[y]=L_child[x]; Build (R_child[x],r_child[y],mid+1, r,v); }}intMain () {n=init (); m=init (); for(intI=1; i<=n;i++) A[i]=init (), hash[i]=A[i]; Discrete (); //for (int i=1;i<=n;i++) printf ("%d", A[i]); for(intI=1; i<=n;i++) Build (root[i-1],root[i],1, Cnt,a[i]); for(intI=1; i<=m;i++) {x=init (); Y=init (); k=init (); printf ("%d\n", Hash[query (root[x-1],root[y],1, Cnt,k)]); }}
Chairman Tree--Seeking static interval K