可持久化线段树样例不过求调
查看原帖
可持久化线段树样例不过求调
933802
ICU152_lowa_IS8楼主2024/3/22 23:23

样例要么正常,要么输出0

#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node{
	int ls,rs,val;
}tree[1000005<<2];
int cnt=1;
int a[1000005];
int root[1000005];
inline void pushup(int p){
	tree[p].val=tree[p<<1].val+tree[p<<1|1].val;
}
void build(int p,int l,int r){
	if(l==r){
		tree[p].val=a[l];
		return;
	}
	tree[p].ls=++cnt;
	tree[p].rs=++cnt;
	int mid=l+r>>1;
	build(tree[p].ls,l,mid);
	build(tree[p].rs,mid+1,r);
	pushup(p);
}
int update(int p,int l,int r,int chg,int k){
	if(l==r&&l==chg){
		tree[++cnt].val=k;
		return cnt;
	}
	int mid=l+r>>1;
	tree[++cnt]=tree[p];
	if(mid>=chg){
		tree[cnt].ls=update(tree[p].ls,l,mid,chg,k);
	}
	else{
		tree[cnt].rs=update(tree[p].rs,mid+1,r,chg,k);
	}
}
int query(int p,int l,int r,int chg){
	if(l==r&&l==chg){
		return tree[p].val;
	}
	int mid=l+r>>1;
	if(mid>=chg){
		return query(tree[p].ls,l,mid,chg);
	}
	else{
		return query(tree[p].rs,mid+1,r,chg);
	}
}
signed main(){
	ios::sync_with_stdio(false);
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,1,n);
	root[0]=1;
	int now=0;
	while(m--){
		int v,op,loc;
		cin>>v>>op>>loc;
//		cout<<root[v]<<"|ASD"<<endl;
//	cout<<cnt<<"|"<<endl;
		if(op==1){
			int val;
			cin>>val;
			update(root[v],1,n,loc,val);
			root[++now]=cnt;
		}
		else{
			cout<<query(root[v],1,n,loc)<<endl;
			root[++now]=root[v];
		}
	}
	return 0;
}


2024/3/22 23:23
加载中...