RT
求调
#include<iostream>
using namespace std;
#define N 100010
int n,m;
int a[N];
int cnt,root;
long long d[N*2],la[N*2];
int ls[N*2],rs[N*2];
void make(int l,int r,int &p)
{
if(!p)
{
p=++cnt;
if(l==r) d[p]=a[l];
}
}
void update(int l,int r,int s,int t,int &p,int c)
{
make(s,t,p);
if(l<=s&&t<=r)
{
d[p]+=(t-s+1)*c;
la[p]+=c;
return ;
}
int mid=s+((t-s)>>1);
if(la[p]&&s!=t)
{
make(s,mid,ls[p]);
make(mid+1,t,rs[p]);
la[ls[p]]+=la[p];
la[rs[p]]+=la[p];
d[ls[p]]+=la[p]*(mid-s+1);
d[rs[p]]+=la[p]*(t-mid);
la[p]=0;
}
if(l<=mid) update(l,r,s,mid,ls[p],c);
if(r>mid) update(l,r,mid+1,t,rs[p],c);
d[p]=d[ls[p]]+d[rs[p]];
}
long long get_sum(int l,int r,int s,int t,int &p)
{
make(s,t,p);
if(l<=s&&t<=r)
{
return d[p];
}
int mid=s+((t-s)>>1);
if(la[p]&&s!=t)
{
make(s,mid,ls[p]);
make(mid+1,t,rs[p]);
la[ls[p]]+=la[p];
la[rs[p]]+=la[p];
d[ls[p]]+=la[p]*(mid-s+1);
d[rs[p]]+=la[p]*(t-mid);
la[p]=0;
}
long long sum=0;
if(l<=mid) sum+=get_sum(l,r,s,mid,ls[p]);
if(r>mid) sum+=get_sum(l,r,mid+1,t,rs[p]);
return sum;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
while(m--)
{
int op,l,r,k;
scanf("%d%d%d",&op,&l,&r);
if(op==1)
{
scanf("%d",&k);
update(l,r,1,n,root,k);
}
else
{
printf("%lld\n",get_sum(l,r,1,n,root));
}
}
return 0;
}
不是全职OIer不能及时回复,望见谅