主席树WA#9#10求调
查看原帖
主席树WA#9#10求调
1045833
__SSY__楼主2025/7/23 20:18

Rt

#include <bits/stdc++.h>
using namespace std;
const int N=100010;
int n,t;
int a[N],b[N];
struct Node{
	int l,r,cnt;
}tr[N*21];
int root[N],idx;
int build(int l,int r){
	int q=++idx;
	if(l==r)
		return q;
	int mid=l+r>>1;
	tr[q].l=build(l,mid);
	tr[q].r=build(mid+1,r);
	return q;
}
int insert(int p,int l,int r,int x){
	int q=++idx;
	tr[q]=tr[p];
	if(l==r){
		tr[q].cnt++;
		return q;
	}
	int mid=l+r>>1;
	if(x<=mid)
		tr[q].l=insert(tr[q].l,l,mid,x);
	else 
		tr[q].r=insert(tr[q].r,mid+1,r,x);
	tr[q].cnt=tr[tr[q].l].cnt+tr[tr[q].r].cnt;
	return q;
}
int query(int q,int p,int l,int r,int k){
	if(l==r)
		return l;
	int cnt=tr[tr[q].l].cnt-tr[tr[p].l].cnt;
	int mid=l+r>>1;
	if(k<=cnt)
		return query(tr[q].l,tr[p].l,l,mid,k);
	return query(tr[q].r,tr[p].r,mid+1,r,k-cnt);
}
int main(){
	scanf("%d%d",&n,&t);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		b[i]=a[i];
	}
	sort(b+1,b+1+n);
	int m=unique(b+1,b+n+1)-b-1;
	root[0]=build(1,m);
	for(int i=1;i<=n;i++)
		root[i]=insert(root[i-1],1,m,lower_bound(b+1,b+m+1,a[i])-b);
	while(t--){
		int l,r,k;
		scanf("%d%d%d",&l,&r,&k);
		printf("%d\n",b[query(root[r],root[l-1],1,m,k)]);
	}
	return 0;
}
2025/7/23 20:18
加载中...