代码如下
#include<bits/stdc++.h>
using namespace std;
const int N=2010000;
int n,m;
int a[N];
int ju;
struct node
{
int l,r,sum,lz;
}tr[N];
void build(int k,int l,int r)
{
tr[k].l=l;
tr[k].r=r;
if(l==r)
{
tr[k].sum=a[l];
return;
}
int mid=(l+r)/2;
build(2*k,l,mid);
build(2*k+1,mid+1,r);
tr[k].sum=tr[2*k].sum+tr[2*k+1].sum;
}
void lazy(int k,int l,int r,int t)
{
tr[k].sum+=t*(r-l+1);
tr[k].lz+=t;
}
void down(int k,int l,int r)
{
int mid=(l+r)/2;
lazy(2*k,l,mid,tr[k].lz);
lazy(2*k+1,mid+1,r,tr[k].lz);
tr[k].lz=0;
}
void update(int l,int r,int k,int t)
{
if(l<=tr[k].l&&r>=tr[k].r)
{
lazy(k,tr[k].l,tr[k].r,t);
return;
}
if(tr[k].lz)
{
down(k,l,r);
}
int mid=(tr[k].l+tr[k].r)/2;
if(l<=mid)
{
update(l,r,2*k,t);
}
if(r>mid)
{
update(l,r,2*k+1,t);
}
tr[k].sum=tr[2*k].sum+tr[2*k+1].sum;
}
int query(int k,int l,int r,int ll,int rr)
{
int ss=0;
if(l>=ll&&r<=rr)
{
return tr[k].sum;
}
if(tr[k].lz!=0)
{
down(k,l,r);
}
int mid=(l+r)/2;
if(ll<=mid)
{
ss+=query(2*k,l,mid,ll,rr);
}
if(rr>mid)
{
ss+=query(2*k+1,mid+1,r,ll,rr);
}
return ss;
}
//int in()
//{
// int ans=0,ff=1;
// int c=getchar();
// for(;!isdigit(c);c=getchar())
// {
// if(c=='-')
// {
// ff=-1;
// }
// }
// for(;isdigit(c);c=getchar())
// {
// ans=ans*10+c-'0';
// }
// return ans*ff;
//}
void out(int x)
{
if(x<0)
{
putchar('-');
x=-x;
}
if(x>=10)
{
out(x/10);
}
putchar(x%10+'0');
}
int main()
{
cin>>n;
cin>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
build(1,1,n);
for(int i=1;i<=m;i++)
{
cin>>ju;
if(ju==1)
{
int x,y,k;
cin>>x>>y>>k;
update(x,y,1,k);
}
else
{
int x,y;
cin>>x>>y;
out(query(1,1,n,x,y));
puts("");
}
}
return 0;
}