题目:POJ2104.
这只是个用来屯板子的blog,原文.
代码如下:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define Abigail inline void
typedef long long LL;
const int N=100000,M=5000;
int n,m,a[N+9],ord[N+9];
int Lower(int *a,int n,int v){
int l=1,r=n,mid=l+r>>1;
for (;l<r;mid=l+r>>1)
v>a[mid]?l=mid+1:r=mid;
return l;
}
int c[N+9];
void Add(int p,int v){if (!p) return;for (;p<=n;p+=p&-p) c[p]+=v;}
int Query(int p){int sum=0;for (;p;p-=p&-p) sum+=c[p];return sum;}
int Query(int l,int r){return Query(r)-Query(l-1);}
struct question{
int opt,l,r,k,id;
}q[N+M+9],lq[N+M+9],rq[N+M+9];
int ans[M+9];
void Solve(question *q,int L,int R,int h,int t){
if (h>t) return;
if (L==R){
for (int i=h;i<=t;++i)
if (!q[i].opt) ans[q[i].id]=ord[L];
return;
}
int mid=L+R>>1,lt=0,rt=0;
for (int i=h;i<=t;++i)
if (q[i].opt){
if (q[i].k>mid) rq[++rt]=q[i];
else Add(q[i].l,1),lq[++lt]=q[i];
}else{
int tmp=Query(q[i].l,q[i].r);
if (q[i].k<=tmp) lq[++lt]=q[i];
else q[i].k-=tmp,rq[++rt]=q[i];
}
for (int i=h;i<=t;++i)
if (q[i].opt&&q[i].k<=mid) Add(q[i].l,-1);
for (int i=1;i<=lt;++i) q[h+i-1]=lq[i];
for (int i=1;i<=rt;++i) q[h+lt+i-1]=rq[i];
Solve(q,L,mid,h,h+lt-1);
Solve(q,mid+1,R,h+lt,t);
}
Abigail into(){
scanf("%d%d",&n,&m);
for (int i=1;i<=n;++i){
scanf("%d",&a[i]);
ord[i]=a[i];
}
for (int i=1;i<=m;++i){
scanf("%d%d%d",&q[i+n].l,&q[i+n].r,&q[i+n].k);
q[i+n].opt=0;q[i+n].id=i;
}
}
Abigail work(){
sort(ord+1,ord+1+n);
for (int i=1;i<=n;++i){
a[i]=Lower(ord,n,a[i]);
q[i].opt=1;q[i].l=i;q[i].k=a[i];
}
Solve(q,1,n,1,n+m);
}
Abigail outo(){
for (int i=1;i<=m;++i)
printf("%d\n",ans[i]);
}
int main(){
into();
work();
outo();
return 0;
}