#include<stdio.h>
#include<algorithm>
#define N 100100
using namespace std;
struct node
{
int x,y,mid;
}a[N*4];
struct Tree
{
int val,num,p;
}tree[20][N];
int st[N];
void build(int x,int y,int cen,int t)
{
int m,v;
a[t].x=x; a[t].y=y; m=a[t].mid=(x+y)>>1;
Tree *last=tree[cen-1],*cur=tree[cen];
int mid=st[m],sum=0,i,l=x,r=m+1;
for(i=m;i>=x;i--)
{
if(st[i]==mid)
sum++;
else
break;
}
for(i=x;i<=y;i++)
{
v=last[i].val;
if(v==mid)
{
if(sum)
{
cur[l++].val=v;
last[i].num=last[i].p=0;
sum--;
}
else
{
cur[r++].val=v;
last[i].num=last[i].p=1;
}
}
else if(v<mid)
{
cur[l++].val=v;
last[i].num=last[i].p=0;
}
else
{
cur[r++].val=v;
last[i].num=last[i].p=1;
}
}
for(i=x+1;i<=y;i++)
last[i].num+=last[i-1].num;
if(x==y) return;
int temp=t<<1;
build(x,m,cen+1,temp);
build(m+1,y,cen+1,temp+1);
}
int query(int x,int y,int k,int cen,int t)
{
Tree l=tree[cen][x],r=tree[cen][y];
int mid=a[t].mid;
if(a[t].x==a[t].y)
return l.val;
int dif=(y-x+1)-(r.num-l.num+l.p);
if(dif>=k)
return query(x-l.num+l.p,y-r.num,k,cen+1,t*2);
else
return query(mid+l.num+1-l.p,mid+r.num,k-dif,cen+1,t*2+1);
}
int main()
{
int t,n,m,i,j,k;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%d",&st[i]);
tree[0][i].val=st[i];
}
sort(st+1,st+1+n);
build(1,n,1,1);
while(m--)
{
scanf("%d%d%d",&i,&j,&k);
printf("%d\n",query(i,j,k,0,1));
}
}
return 0;
}
hdu 2665 裸的划分树
最新推荐文章于 2022-03-17 10:46:21 发布