我的呢,用的标记永久化
#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;
}