下载样例后本地测试无误RE0求条
查看原帖
下载样例后本地测试无误RE0求条
658762
sxq9楼主2025/1/26 11:20

rt,

#include<bits/stdc++.h>
using namespace std;
map<int,int>dui;
int cnt=1,ls[50000010],rs[50000010],tree[50000010],son,ans,a[200010],b[200010],root[200010],x,y,k;
void build(int l,int r,int point){
	if(l==r)return;
	int mid=(l+r)>>1;
	ls[point]=++cnt;
	build(l,mid,cnt);
	rs[point]=++cnt;
	build(mid+1,r,cnt);
}
int add(int l,int r,int point,int mu){
	if(l==r){
		tree[++cnt]=1;
		return cnt;
	}
	int mid=(l+r)>>1;
	if(mu<=mid){
		son=add(l,mid,ls[point],mu);
		ls[++cnt]=son;
		rs[cnt]=rs[point];
		tree[cnt]=tree[ls[cnt]]+tree[rs[cnt]];
		return cnt;
	}
	else{
		son=add(mid+1,r,rs[point],mu);
		rs[++cnt]=son;
		ls[cnt]=ls[point];
		tree[cnt]=tree[ls[cnt]]+tree[rs[cnt]];
		return cnt;
	}
}
int check(int l,int r,int p1,int p2,int k){
	if(l>=r)return l;
	int mid=(l+r)>>1;
//	cout<<"check"<<l<<' '<<r<<' '<<k<<endl;
//	_sleep(100);
//	cout<<"tree"<<tree[ls[p2]]<<" "<<tree[ls[p1]]<<endl;
	if(tree[ls[p2]]-tree[ls[p1]]<k){
//		cout<<"gor"<<endl;
		check(mid+1,r,rs[p1],rs[p2],k-(tree[ls[p2]]-tree[ls[p1]]));
	}
	else if(tree[ls[p2]]-tree[ls[p1]]>=k){
//		cout<<"gol"<<endl;
		check(l,mid,ls[p1],ls[p2],k);
	}
}
int main(){
	int n,m;
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		b[i]=a[i];
	}
	sort(b+1,b+n+1);
	for(int i=1;i<=n;i++)dui[b[i]]=i;
	for(int i=1;i<=n;i++)a[i]=dui[a[i]];
	build(1,n,1);
	root[0]=1;
	for(int i=1;i<=n;i++){
		root[i]=add(1,n,root[i-1],a[i]);
	}
	for(int i=1;i<=m;i++){
		cin>>x>>y>>k;
		cout<<b[check(1,n,root[x-1],root[y],k)]<<"\n";
//		cout<<endl;
	}
	return 0;
}
/*
5 5
25957 6405 15770 26287 26465 
2 2 1
3 4 1
4 5 1
1 2 2
4 4 1
*/
2025/1/26 11:20
加载中...