代码:
#include <bits/stdc++.h>
using namespace std;
struct node
{
int data,left,right,tw;
}a[1000001];
void build(int u,int l,int r)
{
a[u].left=l;
a[u].right=r;
if(l==r)
{
cin>>a[u].data;
return ;
}
int mid=(l+r)/2;
build(u*2,l,mid);
build(u*2+1,mid+1,r);
a[u].data=a[u*2].data+a[u*2+1].data;
}
void xb(int u)
{
a[u*2].data+=a[u].tw*(a[u*2].right-a[u*2].left+1);
a[u*2+1].data+=a[u].tw*(a[u*2+1].right-a[u*2+1].left+1);
a[u*2].tw+=a[u].tw;
a[u*2+1].tw+=a[u].tw;
a[u].tw=0;
}
int query(int u,int l,int r)
{
if(a[u].left>=l && a[u].right<=r)return a[u].data;
xb(u);
int s=0;
if(l<=a[u*2].right)s+=query(u*2,l,r);
if(r>=a[u*2+1].left)s+=query(u*2+1,l,r);
return s;
}
void add(int u,int l,int r,int mi)
{
//cout<<u<<" "<<l<<" "<<r<<" "<<mi<<'\n';
if(a[u].left==l && a[u].right==r)
{
a[u].data+=mi*(a[u].right-a[u].left+1);
a[u].tw+=mi;
return ;
}
if(l<=a[u*2].right)add(u*2,l,a[u*2].right,mi);
if(r>=a[u*2+1].left)add(u*2+1,a[u*2+1].left,r,mi);
a[u].data=a[u*2].data+a[u*2+1].data;
}
int main()
{
int n,m;
cin>>n>>m;
build(1,1,n);
for(int i=1;i<=m;i++)
{
int type,l,r,mi;
cin>>type>>l>>r;
if(type==1){cin>>mi;add(1,l,r,mi);}
if(type==2)cout<<query(1,l,r)<<'\n';
}
return 0;
}