我的呢,用的标记永久化

#include<bits/stdc++.h>
using namespace std;
struct node
{
	long long lb,rb;
	long long s;
	long long lazy;
};
node tree[400005];
long long num[100005];
void build(long long r,long long x,long long y)
{
	tree[r].lb=x;
	tree[r].rb=y;
	tree[r].lazy=0;
	if(x==y)
	{
		tree[r].s=num[x];
		return;
	}
	long long mid=(x+y)/2;
	build(r<<1,x,mid);
	build((r<<1)+1,mid+1,y);
	tree[r].s=tree[r<<1].s+tree[(r<<1)+1].s;
	return;
}
void  change(long long r,long long x,long long y,long long d)
{
	if(x<=tree[r].lb && tree[r].rb<=y)
	{
		tree[r].lazy+=d;
		return;
	}
	tree[r].s+=(min(tree[r].rb,y)-max(tree[r].lb,x)+1)*d;
	long long mid=(tree[r].lb+tree[r].rb)/2; 
	if(x<=mid)
	{
		change(r<<1,x,y,d);
	}
	if(y>mid)
	{
		change((r<<1)+1,x,y,d);
	}
	return;
}
long long findsum(long long r,long long x,long long y)
{
	if(x<=tree[r].lb && tree[r].rb<=y)
	{
		return tree[r].s+(tree[r].rb-tree[r].lb+1)*tree[r].lazy;
	}
	long long ans=(min(tree[r].rb,y)-max(tree[r].lb,x)+1)*tree[r].lazy;
	long long mid=(tree[r].lb+tree[r].rb)/2;
	if(x<=mid)
	{
		ans+=findsum(r<<1,x,y);
	}
	if(y>mid)
	{
		ans+=findsum((r<<1)+1,x,y);
	}
	return ans;
}
int main()
{
    long long n,m;
    scanf("%lld %lld",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",num+i);
    }
    build(1,1,n);
    for(int i=1;i<=m;i++)
    {
        int aa;
        cin>>aa;
        if(aa==1)
        {
            long long x,y,k;
            scanf("%lld %lld %lld",&x,&y,&k);
            change(1,x,y,k);
        }
        if(aa==2)
        {
            long long x,y;
            scanf("%lld %lld",&x,&y);
            printf("%lld\n",findsum(1,x,y));
        }
    }
	return 0;
}
2025/2/6 20:42
1392543
_X_Z_N_2025/2/6 20:42