模板―主席树

匿名 (未验证) 提交于 2019-12-02 23:39:01
#include<bits/stdc++.h> using namespace std; const int maxn=2e6+7; int n,m,q; int a[maxn]; int b[maxn]; int root[maxn]; int lc[maxn<<5]; int rc[maxn<<5]; int sum[maxn<<5]; int l,r,k,p; int cnt; void build(int &t,int l,int r) {     t=++cnt;     if(l==r) return;     int mid=(l+r)>>1;     build(lc[t],l,mid);     build(rc[t],mid+1,r); } int modify(int o,int l,int r) {     int oo=++cnt;     lc[oo]=lc[o],rc[oo]=rc[o],sum[oo]=sum[o]+1;      if(l==r) return oo;     int mid=(l+r)>>1;     if(p<=mid) lc[oo]=modify(lc[oo],l,mid);     else rc[oo]=modify(rc[oo],mid+1,r);     return oo; } int query(int u,int v,int l,int r,int k) {     int ans,mid=(l+r)>>1,x=sum[lc[v]]-sum[lc[u]];     if(l==r) return l;     if(x>=k) ans=query(lc[u],lc[v],l,mid,k);     else ans=query(rc[u],rc[v],mid+1,r,k-x);     return ans; } int main() {     int ans;     scanf("%d%d",&n,&m);     for(int i=1;i<=n;i++)     {         scanf("%d",&a[i]);         b[i]=a[i];     }     sort(b+1,b+1+n);     q=unique(b+1,b+1+n)-b-1;     build(root[0],1,q);     for(int i=1;i<=n;i++)     {         p=lower_bound(b+1,b+q+1,a[i])-b;         root[i]=modify(root[i-1],1,q);     }     for(int i=1;i<=m;i++)     {         scanf("%d%d%d",&l,&r,&k);         ans=query(root[l-1],root[r],1,q,k);         printf("%d\n",b[ans]);     }     return 0; }

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!