poj2104 K-th Number【主席树模板】

来源:互联网 发布:centos 生成uuid 编辑:程序博客网 时间:2024/05/22 20:00

解题思路:

主席树模板题。

#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<cstdlib>#include<cmath>#include<ctime>#include<algorithm>#include<iomanip>#include<cctype>#include<queue>using namespace std;const int N=1e5+5,NLogN=N*20;int n,m,Q,a[N],b[N],rt[N];struct node{    int lc,rc,sum;} tr[NLogN];int pool=0;inline void disc_init(){    sort(b+1,b+m+1);    m=unique(b+1,b+m+1)-b-1;    for(int i=1;i<=n;i++)        a[i]=lower_bound(b+1,b+m+1,a[i])-b;} inline void insert(int y,int &x,int l,int r,int p){    tr[x=++pool]=tr[y];    ++tr[x].sum;    if(l==r)return;    int mid=l+r>>1;    if(p<=mid)insert(tr[y].lc,tr[x].lc,l,mid,p);    else insert(tr[y].rc,tr[x].rc,mid+1,r,p);}inline int query(int nl,int nr,int l,int r,int k){    if(l==r)return l;    int delta=tr[tr[nr].lc].sum-tr[tr[nl].lc].sum;    int mid=l+r>>1;    if(delta>=k)return query(tr[nl].lc,tr[nr].lc,l,mid,k);    else return query(tr[nl].rc,tr[nr].rc,mid+1,r,k-delta);}inline void tree_init(){    for(int i=1;i<=n;i++)        insert(rt[i-1],rt[i],1,m,a[i]);}int main(){    //freopen("lx.in","r",stdin);    scanf("%d%d",&n,&Q);    for(int i=1;i<=n;i++)    {        scanf("%d",&a[i]);        b[++m]=a[i];    }    disc_init();    tree_init();    for(int i=1;i<=Q;i++)    {        int l,r,k;        scanf("%d%d%d",&l,&r,&k);        cout<<b[query(rt[l-1],rt[r],1,m,k)]<<'\n';    }    return 0;}
原创粉丝点击