24pts,根节点正确求调
查看原帖
24pts,根节点正确求调
735556
Taibiquan楼主2025/6/25 22:22
#include<iostream>
using namespace std;
struct node{
	int l,r,dat;//,lazy;
	node &operator =(node b){
		l=b.l,r=b.r,dat=b.dat;
		return *this;
	}
};
node dta[32000001];
int a[1000001];
int root[1000001];
int k=1;
void pushup(node &a){
	a.dat=dta[a.l].dat+dta[a.r].dat;
}
void build(int id,int l,int r){
	if(l==r){
		dta[id].dat=a[l];
//		cout<<id<<'\n';
		return ;
	}
//	cout<<l<<'\t'<<r<<'\t'<<id<<'\n';
	int mid=(l+r)>>1;
	build(dta[id].l=k++,l,mid);
	build(dta[id].r=k++,mid+1,r);
//	pushup(dta[id]);
}
void replace(int id,int l,int r,int x,int val){
	dta[k]=dta[id];
//	cout<<id<<'\t';
//	cout<<dta[id].r<<'\t';
//	cout<<dta[k].r<<'\n';
	id=k++;
//	cout<<l<<'\t'<<r<<'\t'<<id<<'\n';
//	cout<<dta[id].r<<'\n';
	if(l==r){
		dta[id].dat=val;
		return ;
	}
	int mid=(l+r)>>1;
	if(mid>=x){
		replace(dta[id].l,l,mid,x,val);
	}
	else{
		replace(dta[id].r,mid+1,r,x,val);
	}
}
int ask(int id,int l,int r,int x){
//	cout<<l<<'\t'<<r<<'\t'<<x<<'\n';
//	cout<<id<<'\n';
	if(l==r)return dta[id].dat;
	int mid=(l+r)>>1;
	if(mid>=x){
		return ask(dta[id].l,l,mid,x);
	}
	else return ask(dta[id].r,mid+1,r,x);
}
int n,m;
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	root[0]=k++;
	build(1,1,n);
	for(int i=1;i<=m;i++){
		int v,op,p,c;
		cin>>v>>op>>p;
		if(op==1){
			cin>>c;
			root[i]=k;
			replace(root[v],1,n,p,c);
		}
		else{
			root[i]=root[v];
			cout<<ask(root[v],1,n,p)<<'\n';
		}
	}
	return 0;
}
2025/6/25 22:22
加载中...