导航

POJ 2104 【主席树】【区间第K大】

Posted on 2016-05-23 17:09  tun~  阅读(127)  评论(0编辑  收藏  举报
#include<stdio.h>
#include<algorithm>
#include<string.h>
#define MAXN 100010
#define MAXM 5050
using namespace std;
struct tr{
    int l,r,sum;
};
tr tree[MAXN*50];
int root[MAXN];
int cnt;
int jilu[MAXN],from[MAXN];
void updat(int s,int e,int &x,int y,int pos){
    tree[++cnt]=tree[y];
    x=cnt;
    tree[x].sum++;
    if(s==e)return;
    int mid=(s+e)>>1;
    if(mid>=pos)
        updat(s,mid,tree[x].l,tree[y].l,pos);
    else
        updat(mid+1,e,tree[x].r,tree[y].r,pos);
}
int query(int s,int e,int x,int y,int k){
    if(s==e)return s;
    int mid=(s+e)>>1;
    if(tree[tree[y].l].sum-tree[tree[x].l].sum>=k)
        return query(s,mid,tree[x].l,tree[y].l,k);
    else
        return query(mid+1,e,tree[x].r,tree[y].r,k-tree[tree[y].l].sum+tree[tree[x].l].sum);
}
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++){
        scanf("%d",&jilu[i]);
        from[i]=jilu[i];
    }
    sort(jilu,jilu+n);
    int num=unique(jilu,jilu+n)-jilu;
    for(int i=0;i<n;i++){
        int id=upper_bound(jilu,jilu+num,from[i])-jilu;
        updat(1,num,root[i+1],root[i],id);
    }
    for(int i=0;i<m;i++){
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        printf("%d\n",jilu[query(1,num,root[a-1],root[b],c)-1]);
    }
    return 0;
}