比赛 ctime蒟蒻生日赛 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 K小数 最终得分 100
用户昵称 하루Kiev 运行时间 2.609 s
代码语言 C++ 内存使用 230.35 MiB
提交时间 2017-10-17 18:34:57
显示代码纯文本
# include "stdio.h"
# include "iostream"
# include "algorithm"
# define maxn 100005
using namespace std;
int n,m,tot,a[maxn],v[maxn],ai,bi,k;
int rt[maxn],cnt,ls[maxn*200],rs[maxn*200],sum[maxn*200];
void update(int &rt,int las,int pos,int l,int r){
	 rt=++cnt;
	 ls[rt]=ls[las];
	 rs[rt]=rs[las];
	 sum[rt]=sum[las]+1;
	 if(l==r) return;
	 int mid=(l+r)>>1;
	 if(pos<=mid) update(ls[rt],ls[las],pos,l,mid);
	 else update(rs[rt],rs[las],pos,mid+1,r);
}
int query(int x,int y,int l,int r,int k){
	if(l==r) return l;
	int mid=(l+r)>>1;
	int rk=sum[ls[y]]-sum[ls[x]];
	if(k<=rk) return query(ls[x],ls[y],l,mid,k);
	else return query(rs[x],rs[y],mid+1,r,k-rk);
}
int main(){
	freopen("kthnumber.in","r",stdin);
	freopen("kthnumber.out","w",stdout);
	scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) {scanf("%d",&a[i]);v[i]=a[i];}
    sort(a+1,a+1+n);
    int tot=unique(a+1,a+1+n)-a-1;
    for(int i=1;i<=n;i++){
    	v[i]=lower_bound(a+1,a+1+tot,v[i])-a;
    	update(rt[i],rt[i-1],v[i],1,tot);
    }
    while(m--){
    	  scanf("%d%d%d",&ai,&bi,&k);
    	  printf("%d\n",a[query(rt[ai-1],rt[bi],1,tot,k)]);
    }
}