记录编号 593297 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 [NEERC 2004] K小数 最终得分 100
用户昵称 Gravatar健康铀 是否通过 通过
代码语言 C++ 运行时间 4.900 s
提交时间 2024-08-28 22:52:21 内存使用 42.22 MiB
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
long long n,m,a[200010],cnt,rt[200010],top,num;
vector<long long> v;
long long get(long long x){
	return lower_bound(v.begin(),v.end(),x)-v.begin()+1;
}
struct abc{
	long long l;
	long long r;
	long long s;
}e[5000010];
long long js(long long l,long long r){
	long long x=++cnt;
	if(l==r){
	  return x;	
	}
	e[x].l=js(l,(l+r)/2);
	e[x].r=js((l+r)/2+1,r);
//	cout<<e[x].l<<" "<<e[x].r<<" "<<endl;
	return x;
}
long long cr(long long pre,long long l,long long r,long long v){
	long long x=++cnt;
	e[x].l=e[pre].l,e[x].r=e[pre].r,e[x].s=e[pre].s+1;
	if(l==r){
		return x; 
	}
	long long mid=(r+l)/2;
	if(v<=mid){
		e[x].l=cr(e[pre].l,l,mid,v);
	}
	else{
		e[x].r=cr(e[pre].r,mid+1,r,v);
	}
	return x;
}
long long ask(long long x,long long y,long long l,long long r,long long k){
    if(l>=r)return l;
    long long ans=e[e[y].l].s-e[e[x].l].s;
    
    if (ans>=k) return ask(e[x].l, e[y].l, l, (l+r)/2, k);
    else return ask(e[x].r, e[y].r, (r+l)/2+1, r, k-ans);
}
int main(){
	freopen("kthnumber.in","r",stdin);
    freopen("kthnumber.out","w",stdout);
	cin>>n>>m;
	for(long long i=1;i<=n;i++){
		cin>>a[i];
		v.push_back(a[i]);
	}
    sort(v.begin(),v.end());
    v.erase(unique(v.begin(),v.end()),v.end());
	num=get(v[v.size()-1]);
	rt[0]=js(1,num);
	for(long long i=1;i<=n;i++){
		rt[i]=cr(rt[i-1],1,num,get(a[i]));
	}
    while(m--){
        long long x,y,k;
        cin>>x>>y>>k;
        cout<<v[ask(rt[x-1],rt[y],1,num,k)-1]<<endl;
    }
	return 0;
}