首页 > 代码库 > hdu 2665
hdu 2665
区间第k大
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #define MID ((l+r)>>1) 6 using namespace std; 7 8 const int N=100500; 9 10 int a[N],s[N],t[20][N],num[20][N];11 int n,m;12 void build(int c,int l,int r){13 int lm=MID-l+1,lp=l,rp=MID+1;14 for(int i=l;i<=MID;i++)15 lm-=s[i]<s[MID];16 for(int i=l;i<=r;i++)17 {18 if(i==l)19 num[c][i]=0;20 else21 num[c][i]=num[c][i-1];22 if(t[c][i]==s[MID])23 {24 if(lm)25 {26 lm--;27 num[c][i]++;28 t[c+1][lp++]=t[c][i];29 }30 else31 t[c+1][rp++]=t[c][i];32 }33 else if(t[c][i]<s[MID])34 {35 num[c][i]++;36 t[c+1][lp++]=t[c][i];37 }38 else39 t[c+1][rp++]=t[c][i];40 }41 if(l<r)42 build(c+1,l,MID),build(c+1,MID+1,r);43 }44 int query(int c,int l,int r,int ql,int qr,int k){45 if(l==r){46 return t[c][l];47 }48 int s,ss;49 if(l==ql)50 s=0,ss=num[c][qr];51 else52 s=num[c][ql-1],ss=num[c][qr]-num[c][ql-1];53 if(k<=ss)54 return query(c+1,l,MID,l+s,l+s+ss-1,k);55 else56 return query(c+1,MID+1,r,MID+1+ql-l-s,MID+1+qr-l-s-ss,k-ss);57 }58 int main()59 {60 int T;61 62 int l,r,k;63 cin>>T;64 while(T--){65 scanf("%d%d",&n,&m);66 for(int i=1;i<=n;i++){67 scanf("%d",&a[i]);68 s[i]=t[0][i]=a[i];69 }70 sort(s+1,s+1+n);71 build(0,1,n);72 for(int i=0;i<m;i++){73 scanf("%d%d%d",&l,&r,&k);74 printf("%d\n",query(0,1,n,l,r,(k)));75 }76 }77 return 0;78 }
hdu 2665
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。