Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
划分树水之!!!#include <cstdio> #include <iostream> #include <cstdlib> #include <algorithm> #define stop system("pause") #define M 1000004+84 using namespace std; struct no{ int val[M],sum[M],deep; }tree[23]; struct se{ int x, y; }a[M]; bool cmp(se s,se d){ return s.x<d.x; } void build(int h,int l,int r){ if(l==r) return; int mid=(l+r)>>1,p=0,t=0; for(int i=l;i<=r;i++){ if(tree[h].val[i]<=mid){ tree[h+1].val[l+p]=tree[h].val[i]; p++; tree[h].sum[i]=p; }else { tree[h+1].val[mid+1+t]=tree[h].val[i]; t++; tree[h].sum[i]=p; } } build(h+1,l,mid); build(h+1,mid+1,r); } int find(int h,int l,int r,int ll,int rr,int k) { if (ll==rr) return (tree[h].val[ll]); int ls=0,rs=0; if (ll>l) ls=tree[h].sum[ll-1]; else ls=0; int mid=(l+r)>>1; rs=tree[h].sum[rr]; if (rs-ls>=k) return find(h+1,l,mid,l+ls,l+rs-1,k); else return find(h+1,mid+1,r,mid+1+ll-l-ls,mid+rr-l+1-rs,k-(rs-ls)); if(ll==rr) return tree[h].val[ll]; } int main(){ int n,m; while(~scanf("%d%d",&n,&m)){ int t=0; for(int i=1;i<=n;i++){ scanf("%d",&a[i].x); a[i].y=i; } sort(a+1,a+n+1,cmp); for(int i=1;i<=n;i++){ tree[0].val[a[i].y]=i; } build(0,1,n); while(m--){ int q,w,k; scanf("%d%d%d",&q,&w,&k); printf("%d\n",a[find(0,1,n,q,w,k)].x); } } } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator