玄关求调全wa(可持久化)
查看原帖
玄关求调全wa(可持久化)
696748
youakioi楼主2025/7/22 10:29
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int N=2e5+10,M=4e6+10;
int n,q,m,a[N],ls[M],rs[M],sum[M],b[N],rt[N],cnt; 
int build(int l,int r){
	int x=++cnt;
	if(l<r){
		int mid=(l+r)>>1; 
		ls[x]=build(l,mid);
		rs[x]=build(mid+1,r);
	}
	return x;
}
int add(int pre,int l,int r,int p){
	int x=++cnt;
	ls[x]=ls[pre],rs[x]=rs[pre],sum[x]=sum[pre]+1;
	if(l<r){
		int mid=(l+r)>>1;
		if(p<=mid) ls[x]=add(ls[pre],l,mid,p);
		else rs[x]=add(rs[pre],mid+1,r,p);
	}
	return x;
}
int query(int u,int v,int l,int r,int p){
	if(l==r) return l;
	int mid=(l+r)>>1,x=sum[ls[v]]-sum[ls[u]];
	if(x>=p) return query(ls[u],ls[v],l,mid,p);
	else return query(rs[u],rs[v],mid+1,r,p-x);
}
signed main(){
	//freopen("","r",stdin);
	//freopen("","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>q;
	for(int i=1;i<=n;i++) cin>>a[i],b[i]=a[i];
//	cout<<'#'<<endl;
	sort(b+1,b+n+1);
	m=unique(b+1,b+n+1)-b-1;
	rt[0]=build(1,m); 
	for(int i=1;i<=n;i++){
		int k=lower_bound(b+1,b+m+1,a[i])-b;
		rt[i]=add(rt[i-1],1,m,k);
	}
	while(q--){
		int l,r,k;
		cin>>l>>r>>k;
		cout<<b[query(rt[l-1],rt[r],1,m,k)]<<endl;
	}
	return 0;
}


2025/7/22 10:29
加载中...