可持久化线段树70分#3#4#5WA
查看原帖
可持久化线段树70分#3#4#5WA
744895
liaoxingrui楼主2024/4/11 14:52
#include<bits/stdc++.h>
#define mid (r-l>>1)+l
using namespace std;
const int N=2e5+5;
int n,m,l,r,tot,rank;
int a[N],b[N],root[N];
struct TREE{
	int l,r,val;
}tree[N<<5];
inline int build(int l,int r){
	tot++;
	int node=tot;
	if(l==r)
		return node;
	tree[node].l=build(l,mid);
	tree[node].r=build(mid+1,r);
	return node;
}
inline int updata(int head,int l,int r,int x){
	tot++;
	int node=tot;
	tree[node].l=tree[head].l;
	tree[node].r=tree[head].r;
	tree[node].val=tree[head].val+1;
	if(l==r)
		return node;
	if(x<=mid)
		tree[node].l=updata(tree[head].l,l,mid,x);
	else
		tree[node].r=updata(tree[head].r,mid+1,r,x);
	return node;
}
inline int query(int head,int next,int l,int r,int rank){
	if(l==r)
		return b[l];
	int x=tree[tree[next].l].val-tree[tree[head].l].val;
	if(x>=rank)
		return query(tree[head].l,tree[next].l,l,mid,rank); 
	else
		return query(tree[head].r,tree[next].r,mid+1,r,rank-x); 
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		b[i]=a[i];
	}
	sort(b+1,b+n+1);
	int size=unique(b+1,b+n+1)-b-1;
	root[0]=build(1,size);
	for(int i=1;i<=n;i++)
		root[i]=updata(root[i-1],1,size,lower_bound(b+1,b+n+1,a[i])-b);
	while(m--){
		cin>>l>>r>>rank;
		cout<<query(root[l-1],root[r],1,size,rank)<<endl;
	}
	return 0;
}
2024/4/11 14:52
加载中...