24pts求调
查看原帖
24pts求调
658762
sxq9楼主2024/5/21 17:48

rt,操作2有开新版本

#include<bits/stdc++.h>
using namespace std;
int a[1000010],root[1000010];
struct dian{
	int l,r,val;
}pt[100000010];
int n,m,cnt,c;
void build(int l,int r,int point){
	cnt++;
	if(l==r){
		pt[point].val=a[++c];
		return;
	}
	int mid=(l+r)>>1;
	build(l,mid,point<<1);
	build(mid+1,r,(point<<1)+1);
	pt[point].l=point<<1;
	pt[point].r=(point<<1)+1;
	pt[point].val=pt[point<<1].val+pt[(point<<1)+1].val;
	return;
}
int change(int l,int r,int lo,int va,int point){
	cnt++;pt[cnt]=pt[point];
	int p=cnt;
	if(l==r){
		pt[cnt].val=va;
//		cout<<pt[cnt].val<<' ';
		return cnt; 
	}
	int mid=(l+r)>>1;
	if(lo<=mid)pt[p].l=change(l,mid,lo,va,pt[point].l);
	else pt[p].r=change(mid+1,r,lo,va,pt[point].r);
	pt[p].val=pt[pt[p].l].val+pt[pt[p].r].val;
//	cout<<pt[p].val<<' '<<p<<' '<<l<<' '<<r<<' '<<pt[pt[p].l].val<<' '<<pt[pt[p].r].val<<endl;;
	return p;
}
int check(int l,int r,int lo,int point){
	cnt++;pt[cnt]=pt[point];
	int p=cnt;
	if(l==r){
		printf("%d\n",pt[p].val);
		return cnt;
	}
	int mid=(l+r)>>1;
	if(lo<=mid)pt[p].l=check(l,mid,lo,pt[point].l);
	else pt[p].r=check(mid+1,r,lo,pt[point].r);
	return p;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	build(1,n,1);
	root[0]=1;
	for(int i=1;i<=m;i++){
		int v,c,lo,va;
		scanf("%d%d",&v,&c);
		switch(c){
			case 1:{
				scanf("%d%d",&lo,&va);
				root[i]=change(1,n,lo,va,root[v]);
//				cout<<pt[root[i]].val;
				break;
			}
			case 2:{
				scanf("%d",&lo);
				root[i]=check(1,n,lo,root[v]);
				break;
			}
		}
	}
	return 0;
}
2024/5/21 17:48
加载中...