玄关求条QAQ
查看原帖
玄关求条QAQ
1632009
pxn1234楼主2025/7/2 14:11
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define N 1000010
#define pii pair<int,int>
int n,a[N];
int sum[N],add[N],ls[N],rs[N],tot;
int rt[N];
int clone(int x){
	tot++;
	sum[tot]=sum[x];
	add[tot]=add[x];
	ls[tot]=ls[x];
	rs[tot]=rs[x];
	return tot;
}
int newnode(){
	tot++;
	return tot;
}
void build(int &pos,int l,int r){
	if(!pos)pos=newnode();
	if(l==r){
		sum[pos]=a[l];
	}else{
		int mid=l+r>>1;
		build(ls[pos],l,mid);
		build(rs[pos],mid+1,r);
		sum[pos]=sum[ls[pos]]+sum[rs[pos]];
	}
}
int change(int pos,int l,int r,int x,int y,int k){
	if(y<l||x>r)return pos;
	pos=clone(pos);
	if(x<=l&&r<=y)add[pos]+=k;
	else{
		int mid=l+r>>1;
		sum[pos]+=(min(r,y)-max(l,x)+1)*k;
		ls[pos]=change(ls[pos],l,mid,x,y,k);
		rs[pos]=change(rs[pos],mid+1,r,x,y,k);
	}
	return pos;
}
int query(int pos,int l,int r,int x,int y){
	if(y<l||x>r)return 0;
	if(x<=l&&r<=y)return sum[pos]+add[pos]*(r-l+1);
	else{
		int mid=l+r>>1;
		int ans=add[pos]*(min(r,y)-max(l,x)+1);
		ans+=query(ls[pos],l,mid,x,y);
		ans+=query(rs[pos],mid+1,r,x,y);
		return ans;
	}
}
void print(int x){
	for(int i=1;i<=n;i++){
		cerr<<query(rt[x],1,n,i,i)<<' ';
	}
	cerr<<'\n';
}
signed main(){
	cin>>n;
	int q;
	cin>>q;
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	build(rt[0],1,n);
	for(int i=1;i<=q;i++){
		int v,t;
		scanf("%lld%lld",&v,&t);
		if(t==1){
			int x,y,k;
			scanf("%lld%lld",&x,&k);
//			scanf("%lld%lld%lld",&x,&y,&k);
			rt[i]=change(rt[v],1,n,x,x,k);
//			rt[i]=change(rt[v],1,n,x,y,k);
		}else if(t==2){
			int x,y;
			scanf("%lld",&x);
//			scanf("%lld%lld",&x,&y);
			rt[i]=rt[v];
			printf("%lld\n",query(rt[v],1,n,x,x));
//			printf("%lld\n",query(rt[v],1,n,x,y));
		}else if(t==3){
			print(v);
		}
	}
	for(int i=0;i<=q;i++){
		cerr<<'&',print(i);
	}
	return 0;
}
/*
5 10
59 46 14 87 41
0 2 1
0 1 1 14
0 1 1 57
0 1 1 88
4 2 4
0 2 5
0 2 4
4 2 1
2 2 2
1 1 5 91
*/
2025/7/2 14:11
加载中...