#include<iostream>
#include<stdio.h>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;
char c[10];
const long long maxn=300010;
typedef long long ffi;
struct NODE
{
ffi l,r;
ffi sum,lazy;
void update(ffi val)
{
sum+=val*(r-l+1);
lazy+=val;
}
}node[maxn<<4];
void pushup(ffi nd)
{
node[nd].sum=node[nd<<1].sum+node[nd<<1|1].sum;
}
void pushdown(ffi nd)
{
ffi laz=node[nd].lazy;
if(laz)
{
node[nd<<1].update(laz);
node[nd<<1|1].update(laz);
node[nd].lazy=0;
}
}
void build(ffi l,ffi r,ffi nd)
{
node[nd].l=l;
node[nd].r=r;
node[nd].lazy=0;
if(l==r)
{
scanf("%lld",&node[nd].sum);
//cin>>node[nd].sum;
return;
}
int mid=(l+r)>>1;
build(l,mid,nd<<1);
build(mid+1,r,nd<<1|1);
pushup(nd);
}
void update(ffi nl,ffi nr,ffi val,ffi nd,int flag)
{
ffi L=node[nd].l,R=node[nd].r;
if(nl<=L&&R<=nr)
{
if(nl==L&&nl==R&&flag)
{node[nd].sum=val;
return;}
node[nd].update(val);
return;
}
pushdown(nd);
ffi mid=(L+R)>>1;
if(nl<=mid)update(nl,nr,val,nd<<1,flag);
if(nr>mid)update(nl,nr,val,nd<<1|1,flag);
pushup(nd);
}
ffi query(ffi nl,ffi nr,ffi nd)
{
ffi L=node[nd].l,R=node[nd].r;
if(nl<=L&&R<=nr)
{
return node[nd].sum;
}
pushdown(nd);
ffi ans=0;
ffi mid=(L+R)>>1;
if(nl<=mid)ans+=query(nl,nr,nd<<1);
if(nr>mid)ans+=query(nl,nr,nd<<1|1);
pushup(nd);
return ans;
}
int main()
{
ffi n,q;scanf("%lld%lld",&n,&q);
//cin>>n>>q;
build(1,n,1);
while(q--)
{
scanf("%s",&c);
ffi nl,nr,val;
scanf("%lld%lld",&nl,&nr);
if(c[1]=='1')
{
scanf("%lld",&val);
update(nl,nr,val,1,0);
}
if(c[1]=='2')
{
scanf("%lld",&val);
update(nl,nr,-val,1,0);
}
if(c[1]=='3')
{update(nl,nl,nr,1,1);
}
if(c[1]=='4')
{
printf("%lld\n",query(nl,nr,1));
}
}
}
选拔赛j题哭泣的阿木木
最新推荐文章于 2019-06-18 20:18:44 发布