题面
记录
#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+2].val+tree[x].lazy;}
inline void build(int x,int l,int r)
{
tree[x].lch=l;
tree[x].rch=r;
if(l==r)
{
tree[x].val=a[x];
return ;
}
mid=(l+r)>>1;
build(2*x,l,mid);
build(2*x+1,mid+1,r);
}
inline void change(int k,int x,int y)
{
if(tree[k].lch==tree[k].rch)
{
tree[k].val=y;
return ;
}
mid=(tree[k].lch+tree[k].rch)>>1;
if(x<=mid) change(k*2,x,y);
else change(k*2+1,x,y);
update(k);
}
inline void changes(int k,int l,int r,int x)
{
if(tree[k].lch==l&&tree[k].rch==r)
{
tree[k].val+=(r-l+1)*x;
tree[k].lazy+=x;
return ;
}
mid=(tree[k].lch+tree[k].rch)>>1;
if(r<=mid) changes(k*2,l,r,x);
else if(l>mid) changes(k*2+1,l,r,x);
else
{
changes(k*2,l,mid,x);
changes(k*2+1,mid+1,r,x);
}
update(k);
}
inline void down(int x)
{
if(tree[x].lch==tree[x].rch)
{
tree[x].lazy=0;
return ;
}
tree[x*2].val+=(tree[x*2].rch-tree[x*2].lch+1)*tree[x].lazy;
tree[x*2+1].val+=(tree[x*2+1].rch-tree[x*2+1].lch+1)*tree[x].lazy;
tree[x*2].lazy+=tree[x].lazy;
tree[x*2+1].lazy+=tree[x].lazy;
tree[x].lazy=0;
}
inline long long asks(int x,int l,int r)
{
if(tree[x].lazy) down(x);
if(tree[x].lch==tree[x].rch) return tree[x].val;
mid=(tree[x].lch+tree[x].rch)>>1;
if(r<=mid) return asks(x*2,l,r);
else if(l>mid) return asks(x*2+1,l,r);
else return asks(x*2,l,mid)+asks(x*2+1,mid+1,r);
}
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;
}