线段树板子:
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
#define int long long
using namespace std;
using namespace __gnu_pbds;
int n,m;
int tr[400005];
int a[100005];
int tag[400005];
inline void build(int id,int l,int r)
{
if(l==r)
{
tr[id]=a[l];
return;
}
else
{
int m=(l+r)>>1;
build(id<<1,l,m);
build(id<<1|1,m+1,r);
tr[id]=tr[id<<1]+tr[id<<1|1];
}
}
inline void update(int id,int l,int r,int x,int y,int d)
{
if(l==x&&r==y)
{
tag[id]+=d;
return;
}
tr[id]+=(y-x+1)*d;
int m=(l+r)>>1;
if(y<=m)
{
update(id<<1,l,m,x,y,d);
}
else if(x>m)
{
update(id<<1|1,m+1,r,x,y,d);
}
else
{
update(id<<1,l,m,x,m,d);
update(id<<1|1,m+1,r,m+1,y,d);
}
}
inline int sum(int id,int l,int r,int x,int y,int p)
{
p+=tag[id];
if(l==x&&r==y)return p*(r-l+1)+tr[id];
int m=(l+r)>>1;
if(y<=m)
{
return sum(id<<1,l,m,x,y,p);
}
else if(x>m)
{
return sum(id<<1|1,m+1,r,x,y,p);
}
else
{
return (sum(id<<1,l,m,x,m,p)+sum(id<<1|1,m+1,r,m+1,y,p));
}
}
signed main()
{
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
//cerr<<;
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
build(1,1,n);
for(int i=1;i<=m;i++)
{
int op,x,y;
cin>>op>>x>>y;
if(op==1)
{
int d;
cin>>d;
update(1,1,n,x,y,d);
}
else
{
cout<<sum(1,1,n,x,y,0)<<endl;
}
}
//fclose(stdin);
//fclose(stdout);
return 0;
}