区间修改+区间查询:
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int n,m,ans;
int a[N];
struct mm
{
int l,r;
int add,sum;
}tree[4*N+5];
void build(int k,int L,int R)
{
tree[k].l=L;
tree[k].r=R;
if(L==R)
{
tree[k].sum=a[L];
return ;
}
int mid=(L+R)/2;
build(2*k,L,mid);
build(2*k+1,mid+1,R);
tree[k].sum=tree[2*k].sum+tree[2*k+1].sum;
}
void pushup(int k,int L,int R)
{
if(R>L)
tree[k].sum=tree[2*k].sum+tree[2*k+1].sum;
tree[k].sum+=tree[k].add*(R-L+1);
}
void add(int k,int L,int R,int d)
{
if(L>tree[k].r||R<tree[k].l) return ;
if(L<=tree[k].l&&R>=tree[k].r)
{
tree[k].add+=d;
return ;
}
add(2*k,L,R,d);
add(2*k+1,L,R,d);
pushup(k,L,R);
}
void ask(int k,int L,int R,int add)
{
if(L>tree[k].r||R<tree[k].l) return ;
if(L<=tree[k].l&&R>=tree[k].r)
{
ans+=tree[k].sum+add*(R-L+1)+tree[k].add;
return ;
}
ask(2*k,L,R,add+tree[k].add);
ask(2*k+1,L,R,add+tree[k].add);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
build(1,1,n);
for(int i=1;i<=m;i++)
{
int Num,x,y,k;
scanf("%d",&Num);
if(Num==1)
{
scanf("%d%d%d",&x,&y,&k);
add(1,x,y,k);
}
if(Num==2)
{
scanf("%d%d",&x,&y);
ans=0;
ask(1,x,y,0);
printf("%d\n",ans);
}
}
return 0;
}