#include<bits/stdc++.h>
using namespace std;
struct tree{
long long data,lazy=0,num;
}tree[5000001];
long long b[5000001];
long long ans=0;
void build( long long l, long long r, long long rt) //rt是树的编号
{
if(l==r)
{
tree[rt].data=b[l]-b[l-1];
tree[rt].num=r-l+1;
return;
}
tree[rt].data=b[r]-b[l-1];
tree[rt].num=r-l+1;
long long mid=(l+r)/2;
build(l,mid,2*rt);
build(mid+1,r,2*rt+1);
return;
}
void push_down( long long rt, long long k)
{
if(tree[rt].lazy>0)
{
tree[rt].lazy=0;
tree[2*rt].lazy+=k;
tree[2*rt].data+=tree[2*rt].num*k;
tree[2*rt+1].lazy+=k;
tree[2*rt+1].data+=tree[2*rt+1].num*k;
}
return;
}
void add( long long rt, long long l, long long r, long long ql, long long qr, long long k)
{
if(ql>r||qr<l) return;
if(ql<=l&&qr>=r)
{
tree[rt].lazy+=k;
tree[rt].data+=(k*tree[rt].num);
//cout<<"!!!"<<endl;
return;
}
long long mid=(l+r)/2;
push_down(rt,tree[rt].lazy);//划重点
add(2*rt,l,mid,ql,qr,k);
add(2*rt+1,mid+1,r,ql,qr,k);
tree[rt].data=tree[2*rt].data+tree[2*rt+1].data;
return;
}
void check( long long rt, long long l, long long r, long long ql, long long qr)
{
if(ql>r||qr<l) return;
if(ql<=l&&qr>=r)
{
ans+=tree[rt].data;
return;
}
long long mid=(r+l)/2;
push_down(rt,tree[rt].lazy);
check(rt*2,l,mid,ql,qr);
check(rt*2+1,mid+1,r,ql,qr);
return;
}
int main()
{
long long n,m;cin>>n>>m;
for( long long i=1;i<=n;i++)
{
long long a;cin>>a;
b[i]=a+b[i-1];
}
build(1,n,1);
/*for( long long i=1;i<=25;i++)
{
cout<<tree[i].data<<' ';
}
cout<<endl;*/
for( long long i=1;i<=m;i++)
{
long long a,x,y;cin>>a>>x>>y;
if(a==1)
{
long long k;cin>>k;
add(1,1,n,x,y,k);
}
else
{
ans=0;
check(1,1,n,x,y);
cout<<ans<<endl;
}
/*for( long long i=1;i<=25;i++)
{
cout<<tree[i].data<<' ';
}
cout<<endl;*/
}
return 0;
}
没有回复内容