可持久化权值线段树 WA32pts 求助
查看原帖
可持久化权值线段树 WA32pts 求助
420692
Leonid楼主2023/9/5 23:28

rt,tlq 好像没有一个跟我一样的。

#include<bits/stdc++.h>

using namespace std;

#define ll long long
#define ull unsigned long long
#define db double
#define ld long double

#define M 500005
#define N 10000005
#define mod 1000000007
#define inf 1e9
#define dinf 1e15
#define linf 1e18+7
#define eps 1e-15
#define delta 0.997

int n;
struct Query{
	int v,op,x;
}q[M];
int lsh[M],cnt;

int rt[N],tot;
struct segment_tree{
	int sum[N];
	int ls[N],rs[N];
	
	void push_up(int p){
		sum[p]=sum[ls[p]]+sum[rs[p]];
	}
	
	int update(int p,int i,int L,int R,int x){
		int root=++tot;
		sum[root]=sum[p];
		ls[root]=ls[p];
		rs[root]=rs[p];
		sum[root]+=x;
		if(sum[root]<0) sum[root]=0;
		if(L==R) return root;
		int mid=(L+R)>>1;
		if(i<=mid) ls[root]=update(ls[p],i,L,mid,x);
		else rs[root]=update(rs[p],i,mid+1,R,x);
		return root;
	}
	
	int getrk(int p,int i,int L,int R){
		if(L==R) return 0;
		int mid=(L+R)>>1;
		if(i<=mid) return getrk(ls[p],i,L,mid);
		return sum[ls[p]]+getrk(rs[p],i,mid+1,R);
	}
	
	int getval(int p,int i,int L,int R){
		if(L==R) return L;
		int mid=(L+R)>>1;
		if(sum[ls[p]]>=i) return getval(ls[p],i,L,mid);
		return getval(rs[p],i-sum[ls[p]],mid+1,R);
	}
	
	int getpre(int p,int x){
		int rk=getrk(p,x,1,cnt)+1;
		return lsh[getval(p,rk-1,1,cnt)];
	}
	
	int getnxt(int p,int x){
		int rk=getrk(p,x+1,1,cnt);
		return lsh[getval(p,rk+1,1,cnt)];
	}
}t;

int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		scanf("%d %d %d",&q[i].v,&q[i].op,&q[i].x);
		if(q[i].op!=4) lsh[++cnt]=q[i].x;
	}
	lsh[++cnt]=-INT_MAX; lsh[++cnt]=INT_MAX;
	stable_sort(lsh+1,lsh+1+cnt);
	cnt=unique(lsh+1,lsh+1+cnt)-lsh-1;
	for(int i=1;i<=n;++i) if(q[i].op!=4) q[i].x=lower_bound(lsh+1,lsh+1+cnt,q[i].x)-lsh;
	rt[0]=t.update(rt[0],1,1,cnt,1);
	rt[0]=t.update(rt[0],cnt,1,cnt,1);
	for(int i=1;i<=n;++i){
		if(1<=q[i].op&&q[i].op<=2){
			if(q[i].op==1) rt[i]=t.update(rt[q[i].v],q[i].x,1,cnt,1);
			if(q[i].op==2) rt[i]=t.update(rt[q[i].v],q[i].x,1,cnt,-1);
		} else {
			if(q[i].op==3) printf("%d\n",t.getrk(rt[q[i].v],q[i].x,1,cnt));
			if(q[i].op==4) printf("%d\n",lsh[t.getval(rt[q[i].v],q[i].x+1,1,cnt)]);
			if(q[i].op==5) printf("%d\n",t.getpre(rt[q[i].v],q[i].x));
			if(q[i].op==6) printf("%d\n",t.getnxt(rt[q[i].v],q[i].x));
			rt[i]=rt[q[i].v];
		}
	}
	return 0;
}
2023/9/5 23:28
加载中...