记录编号 366345 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 [NEERC 2004] K小数 最终得分 100
用户昵称 GravatarFoolMike 是否通过 通过
代码语言 C++ 运行时间 2.062 s
提交时间 2017-01-23 17:46:22 内存使用 17.61 MiB
显示代码纯文本
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int n,q,a[N],s[20][N],T[20][N];
void build(int h,int l,int r){
	int *x=T[h],*y=T[h+1];
	if (l==r){y[l]=x[l];return;}
	int mid=(l+r)>>1,flag=a[mid],cnt=l,p=l,q=mid+1;
	for (int i=l;i<=r;i++)
		if (x[i]<flag) cnt++;
	for (int i=l;i<=r;i++){
		s[h][i]=(i==l?0:s[h][i-1]);
		if (x[i]<flag) y[p++]=x[i],s[h][i]++;else
		if (x[i]==flag&&cnt<=mid) y[p++]=x[i],s[h][i]++,cnt++;
			else y[q++]=x[i];
	}
	build(h+1,l,mid);
	build(h+1,mid+1,r);
}
int ask(int h,int l,int r,int L,int R,int k){
	if (L==R) return T[h][L];
	int mid=(l+r)>>1,cl=(l==L?0:s[h][L-1]),cr=s[h][R];
	if (k<=cr-cl) return ask(h+1,l,mid,l+cl,l+cr-1,k);
	return ask(h+1,mid+1,r,mid+1+L-l-cl,mid+1+R-l-cr,k-cr+cl);
}
int main()
{
	freopen("kthnumber.in","r",stdin);
	freopen("kthnumber.out","w",stdout);
	scanf("%d%d",&n,&q);
	for (int i=1;i<=n;i++)
		scanf("%d",&a[i]),T[0][i]=a[i];
	sort(a+1,a+n+1);
	build(0,1,n);
	while (q--){
		int l,r,k;
		scanf("%d%d%d",&l,&r,&k);
		printf("%d\n",ask(0,1,n,l,r,k));
	}
	return 0;
}