可持久化线段树 4pts
查看原帖
可持久化线段树 4pts
649611
Zelensky楼主2023/9/13 19:04
#include<bits/stdc++.h>
#define ls tree[i].lss
#define rs tree[i].rss
using namespace std;
int rt[1000000];
struct ccc{
	int lss,rss,siz;
}tree[(int)1e6*30];
int cnt=0;
int a[10000000],b[10000000];
int copy(int old){
	tree[++cnt]=tree[old];
	return cnt;
}
int build(int i,int l,int r){
	i=++cnt;
	if(l==r){
		return i; 
	}
	int mid=(l+r)>>1;
	ls=build(ls,l,mid);
	rs=build(rs,mid+1,r);
	tree[i].siz=tree[ls].siz+tree[rs].siz;
	return i;
}
int change(int i,int l,int r,int x,int k){
	i=copy(i);
	if(l==r){
		tree[i].siz+=k;
		return i;
	}
	int mid=(l+r)>>1;
	if(x<=mid)ls=change(ls,l,mid,x,k);
	else rs=change(rs,mid+1,r,x,k);
	tree[i].siz=tree[ls].siz+tree[rs].siz;
	return i;
}
int get(int be,int ed,int l,int r,int k){
	if(l==r)return l;
	int size=tree[tree[ed].lss].siz-tree[tree[be].lss].siz;
	int mid=(l+r)>>1;
	if(size>=k) return get(tree[be].lss,tree[ed].lss,l,mid,k);
	else return get(tree[be].rss,tree[ed].rss,mid+1,r,k-size);
}
int rank(int be,int ed,int l,int r,int x){
	if(l==r)return 1;
	int size=tree[tree[ed].lss].siz-tree[tree[be].lss].siz;
	int mid=(l+r)>>1;
	if(x<=mid) return get(tree[be].lss,tree[ed].lss,l,mid,x);
	else return get(tree[be].rss,tree[ed].rss,mid+1,r,x)+size;
}
int sum(int i,int l,int r,int x){
	if(l==r)return tree[i].siz;
	int mid=(l+r)>>1;
	if(x<=mid)return sum(ls,l,mid,x);
	else return sum(rs,mid+1,r,x);
}
int opt[1000000],v[10000000],x[10000000];
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int n;
	cin>>n;
	int cnt=0;
	for(int i=1;i<=n;i++){
		cin>>v[i]>>opt[i]>>x[i];
		b[i]=x[i];
	}
	sort(b+1,b+n+1);
	int len=unique(b+1,b+n+1)-b-1;
	for(int i=1;i<=n;i++){
		x[i]=lower_bound(b+1,b+len+1,x[i])-b;
	}
	rt[0]=build(0,1,n);
	int cc=0;
	for(int i=1;i<=n;i++){
//		if(opt[i]==1)cc++;
		if(opt[i]==1)rt[i]=change(rt[v[i]],1,n,x[i],1);
		if(opt[i]==2){
			if(sum(rt[v[i]],1,n,x[i]))rt[i]=change(rt[v[i]],1,n,x[i],-1);
			else rt[i]=rt[v[i]];
		}
		if(opt[i]==3){
			cout<<b[rank(rt[0],rt[v[i]],1,n,x[i])]<<"\n";
			rt[i]=rt[v[i]];
		}
		if(opt[i]==4){
			cout<<b[get(rt[0],rt[v[i]],1,n,x[i])]<<"\n";
			rt[i]=rt[v[i]];
		}
		if(opt[i]==5){
			if(x[i]==1)cout<<-INT_MAX<<"\n";
			else cout<<b[get(rt[0],rt[v[i]],1,n,rank(rt[1],rt[v[i]],1,n,x[i])-1)]<<"\n";
		}
		if(opt[i]==6){
			if(x[i]==len)cout<<INT_MAX<<"\n";
			else cout<<b[get(rt[0],rt[v[i]],1,n,rank(rt[1],rt[v[i]],1,n,x[i])+sum(v[i],1,n,x[i]))]<<"\n";
		}
	}
	return 0;
}
2023/9/13 19:04
加载中...