poj 2104 主席树

来源:互联网 发布:巴黎散步道 知乎 编辑:程序博客网 时间:2024/06/09 20:40
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;struct node1{int ls,rs;int sum;}t[3000000];int tot; int build(int l,int r){int k=tot++;if(l==r){t[k].sum=0;return k;}int m=(l+r)>>1;t[k].ls=build(l,m);t[k].rs=build(m+1,r);t[k].sum=t[t[k].ls].sum+t[t[k].rs].sum;return k;}int update(int pre,int pos,int l,int r){int k=tot++;t[k]=t[pre];if(l==pos&&r==pos){t[k].sum++;return k;}int m=(l+r)>>1;if(pos<=m)t[k].ls=update(t[pre].ls,pos,l,m);elset[k].rs=update(t[pre].rs,pos,m+1,r);t[k].sum=t[t[k].ls].sum+t[t[k].rs].sum;return k;}int query(int l,int r,int a,int b,int k){if(l==r)return l;int m=(l+r)>>1;int tem=t[t[b].ls].sum-t[t[a].ls].sum;if(k<=tem)return query(l,m,t[a].ls,t[b].ls,k);elsereturn query(m+1,r,t[a].rs,t[b].rs,k-tem);} struct node2{    int x,idx;}d[100010];int lo[100100];int rt[100010];bool cmp(const struct node2 &a,const struct node2 &b){return a.x<b.x;}int main(){int n,q;scanf("%d%d",&n,&q);for(int i=1;i<=n;i++){scanf("%d",&d[i].x);d[i].idx=i;}tot=0;sort(d+1,d+n+1,cmp);for(int i=1;i<=n;i++)lo[d[i].idx]=i; rt[0]=build(1,n);for(int i=1;i<=n;i++)rt[i]=update(rt[i-1],lo[i],1,n);while(q--){int a,b,k;scanf("%d%d%d",&a,&b,&k);int tem=query(1,n,rt[a-1],rt[b],k);printf("%d\n",d[tem].x);}}

0 0
原创粉丝点击