可持久化权值线段树12pts求助
查看原帖
可持久化权值线段树12pts求助
209923
PRIMITIVE_LIGHTS楼主2022/3/12 13:26

不知道出了什么问题,连样例也过不了

#include<iostream>
using namespace std;
struct node {
	int lc;
	int rc;
	int w;
};
int cnt=0,root[1000001];
node tr[25000001];
int build() {
	tr[++cnt].lc=0;
	tr[cnt].rc=0;
	tr[cnt].w=0;
	return cnt;
}
void pushup(int k) {
	tr[k].w=0;
	if(tr[k].lc) tr[k].w=tr[tr[k].lc].w;
	if(tr[k].rc) tr[k].w+=tr[tr[k].rc].w;
}
void add(int k1,int k2,int l,int r,int x,int p) {
	if(l==r) {tr[k1].w+=p;return ;}
	int mid=(l+r)>>1;
	if(x<=mid) {
		tr[k1].rc=tr[k2].rc;
		tr[k1].lc=build();
		add(tr[k1].lc,tr[k2].lc,l,mid,x,p);
	} else {
		tr[k1].lc=tr[k2].lc;
		tr[k1].rc=build();
		add(tr[k1].rc,tr[k2].rc,mid+1,r,x,p);
	}
	pushup(k1);
}
int ask(int k,int l,int r,int ql,int qr) {
	if(l>=ql&&r<=qr) {
		return tr[k].w;
	}
	int ret=0;
	int mid=(l+r)>>1;
	if(ql<=mid) if(tr[k].lc)ret+=ask(tr[k].lc,l,mid,ql,qr);
	if(qr>mid) if(tr[k].rc)ret+=ask(tr[k].rc,mid+1,r,ql,qr);
	return ret;
}
int rnk(int k,int x) {
	return ask(root[x],-1e9-1,1e9+1,-1e9-1,k-1)+1;
}
int kth(int k,int l,int r,int x) {
	if(l==r) {
		return l;
	}
	int mid=(l+r)>>1;
	if(x<=tr[tr[k].lc].w) return kth(tr[k].lc,l,mid,x);
	return kth(tr[k].rc,mid+1,r,x-tr[tr[k].lc].w);
}
int pre(int k,int x) {
	if(rnk(k,x)==1) return -2147483647;
	return kth(root[x],-1e9-1,1e9+1,rnk(k,x)-1);
}
int nxt(int k,int x) {
	if(rnk(k,x)+ask(root[x],-1e9-1,1e9+1,k,k)-1==ask(root[x],-1e9-1,1e9+1,-1e9-1,1e9+1)) return 2147483647;
	return kth(root[x],-1e9-1,1e9+1,rnk(k,x)+ask(root[x],-1e9-1,1e9+1,k,k));
}
int n;
int main() {
	root[0]=build();
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n;
	for(int i=1;i<=n;++i) {
		int vi,opt,x;
		cin>>vi>>opt>>x;
		if(opt==1) root[i]=build(),add(root[i],root[vi],-1e9-1,1e9+1,x,1);
		if(opt==2) root[i]=build(),add(root[i],root[vi],-1e9-1,1e9+1,x,-1);
		if(opt==3) root[i]=root[vi],cout<<rnk(x,vi)<<endl;
		if(opt==4) root[i]=root[vi],cout<<kth(root[vi],-1e9-1,1e9+1,x)<<endl;
		if(opt==5) root[i]=root[vi],cout<<pre(x,vi)<<endl;
		if(opt==6) root[i]=root[vi],cout<<nxt(x,vi)<<endl;
	}
}
2022/3/12 13:26
加载中...