区间修改+查询
#include<bits/stdc++.h>
using namespace std;
void build(int x,int l,int r);
void add(int p,int l,int r);
int ask(int p,int l,int r);
const int N=1e5+2;
int n,m,op,x,y,k,a[N],s[4*N],t[4*N];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
build(1,1,n);
while(m--)
{
cin>>op>>x>>y;
if(op==1)
{
cin>>k;
add(1,1,n);
}
else
cout<<ask(1,1,n)<<"\n";
}
return 0;
}
void build(int x,int l,int r)
{
if(l==r)
{
s[x]=a[l];
return;
}
build(x*2,l,l+r>>1);
build(x*2+1,(l+r>>1)+1,r);
s[x]=s[x*2]+s[x*2+1];
}
void add(int p,int l,int r)
{
if(r<x||l>y)
return;
s[p]+=k*(min(r,y)-max(l,x)+1);
if(l>=x&&r<=y)
{
t[p]+=k;
return;
}
add(p*2,l,l+r>>1);
add(p*2+1,(l+r>>1)+1,r);
}
int ask(int p,int l,int r)
{
if(r<x||l>y)
return 0;
if(l>=x&&r<=y)
return s[p];
t[p*2]+=t[p];
t[p*2+1]+=t[p];
s[p*2]+=t[p]*((l+r>>1)+2-l);
s[p*2+1]+=t[p]*(r-(l+r>>1));
t[p]=0;
return ask(p*2,l,l+r>>1)+ask(p*2+1,(l+r>>1)+1,r);
}