hdu 2665 裸的划分树

来源:互联网 发布:db2关闭数据库 编辑:程序博客网 时间:2024/06/07 22:20
#include<stdio.h>#include<algorithm>#define N 100100using 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;}

0 0
原创粉丝点击