题面
记录
#include<bits/stdc++.h>
using namespace std;
int n,m,mid,a[100005],xx,yy,zz,uu;
struct str{
int lch,rch,lazy;
long long val;
}tree[400005];
inline void update(int x){tree[x].val=tree[x*2].val+tree[x*2+1].val;}
inline void build(int x,int l,int r)
{
tree[x].lch=l;
tree[x].rch=r;
tree[x].lazy=0;
if(l==r)
{
tree[x].val=a[l];
return;
}
mid=(l+r)>>1;
build(x*2,l,mid);
build(x*2+1,mid+1,r);
update(x);
}
inline void down(int x)
{
if(tree[x].lazy==0)return;
if(tree[x].lch==tree[x].rch)
{
tree[x].lazy=0;
return;
}
int left_len=tree[x*2].rch-tree[x*2].lch+1;
int right_len=tree[x*2+1].rch-tree[x*2+1].lch+1;
tree[x*2].val+=(long long)left_len*tree[x].lazy;
tree[x*2].lazy+=tree[x].lazy;
tree[x*2+1].val+=(long long)right_len*tree[x].lazy;
tree[x*2+1].lazy+=tree[x].lazy;
tree[x].lazy=0;
}
inline void changes(int k,int l,int r,int x)
{
if(l<=tree[k].lch&&tree[k].rch<=r)
{
tree[k].val+=(long long)(tree[k].rch-tree[k].lch+1)*x;
tree[k].lazy+=x;
return;
}
down(k);
mid=(tree[k].lch+tree[k].rch)>>1;
if(l<=mid)changes(k*2,l,r,x);
if(r>mid)changes(k*2+1,l,r,x);
update(k);
}
inline long long asks(int x,int l,int r)
{
if(l<=tree[x].lch&&tree[x].rch<=r) return tree[x].val;
down(x);
mid=(tree[x].lch+tree[x].rch)>>1;
long long res=0;
if(l<=mid)res+=asks(x*2,l,r);
if(r>mid)res+=asks(x*2+1,l,r);
return res;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
build(1,1,n);
for(int i=1;i<=m;i++)
{
scanf("%d",&xx);
if(xx==1)
{
scanf("%d%d%d",&yy,&zz,&uu);
changes(1,yy,zz,uu);
}
else
{
scanf("%d%d",&yy,&zz);
printf("%lld\n",asks(1,yy,zz));
}
}
return 0;
}