求条
查看原帖
求条
906970
Jerry_Money楼主2025/1/21 17:12

样例全输出同一个数(悲

#include<bits/stdc++.h>
#define int long long
#define M (1<<31)
using namespace std;
int tot;
int n,m,Q;
struct GJX{
	int ls,rs,sum;
}a[10000086];
int b[10000086];
int c[10000086];
int root[10000086];
int newNode(){
	return ++tot;
}
int build_tree(int l,int r){
	int node=newNode();
	if(l==r){
		return node;
	}
	int mid=(l+r)/2;
	a[node].ls=build_tree(l,mid);
	a[node].rs=build_tree(mid+1,r);
	return node;
}
int build_chain(int l,int r,int x,int k){
	int node=newNode();
	a[node].ls=a[x].ls,a[node].rs=a[x].rs;
	a[node].sum=a[x].sum+1;
	if(l==r){
		return node;
	} 
	int mid=(l+r)/2;
	if(k<=mid){
		a[node].ls=build_chain(l,mid,a[x].ls,k);
	}
	else{
		a[node].rs=build_chain(mid+1,r,a[x].rs,k);
	}
}
int query(int u,int v,int l,int r,int k){
	if(l==r)return l;
	int x=a[a[v].ls].sum-a[a[u].ls].sum;
	int mid=(l+r)/2;
	if(x>=k)return query(a[u].ls,a[v].ls,l,mid,k);
	else return query(a[u].rs,a[v].rs,mid+1,r,k-x);
}	
signed main()
{
	cin>>n>>Q;
	for(int i=1;i<=n;i++)cin>>b[i],c[i]=b[i]; 
	sort(b+1,b+1+n);
	m=unique(b+1,b+1+n)-b-1;
	root[0]=build_tree(1,m);
	for(int i=1;i<=n;i++){
		c[i]=lower_bound(b+1,b+1+m,c[i])-b;
		root[i]=build_chain(1,m,root[i-1],c[i]);
	}
	
	while(Q--){	
		int x,y,z;
		cin>>x>>y>>z;
		int p=query(root[x-1],root[y],1,m,z);
		cout<<b[p]<<endl;
	}
	return 0;
}


2025/1/21 17:12
加载中...