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

时间:2023-03-08 22:57:01
POJ 2104 【主席树】【区间第K大】
#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*];
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)>>;
if(mid>=pos)
updat(s,mid,tree[x].l,tree[y].l,pos);
else
updat(mid+,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)>>;
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+,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=;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=;i<n;i++){
int id=upper_bound(jilu,jilu+num,from[i])-jilu;
updat(,num,root[i+],root[i],id);
}
for(int i=;i<m;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
printf("%d\n",jilu[query(,num,root[a-],root[b],c)-]);
}
return ;
}