#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
long long n,q,a[100004],b[100004],add[100004],blo,sum[100004];
void update(int x,int y,int z){
if(b[x]==b[y]){
for(int i=x;i<=y;i++) a[i]+=z,sum[b[i]]+=z;
}else{
for(int i=x;i<=b[x]*blo;i++) a[i]+=z,sum[b[i]]+=z;
for(int i=(b[y]-1)*blo+1;i<=y;i++) a[i]+=z,sum[b[i]]+=z;
for(int i=b[x]+1;i<b[y];i++) add[i]+=z;
}
}
long long query(int x,int y){
long long sum1=0;
if(b[x]==b[y]){
for(int i=x;i<=y;i++) sum1+=a[i]+add[b[i]];
}else{
for(int i=x;i<=b[x]*blo;i++) sum1+=a[i]+add[b[i]];
for(int i=(b[y]-1)*blo+1;i<=y;i++) sum1+=a[i]+add[b[i]];
for(int i=b[x]+1;i<b[y];i++) sum1+=sum[i]+add[i]*blo;
}
return sum1;
}
int main(){
scanf("%d",&n);
scanf("%d",&q);
blo=sqrt(n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
b[i]=(i-1)/blo+1;
sum[b[i]]+=a[i];
}
for(int i=1;i<=q;i++){
int s,x,y,z;
scanf("%d",&s);
if(s==1) {
scanf("%d%d%d",&x,&y,&z);
update(x,y,z);
}
else {
scanf("%d%d",&x,&y);
printf("%lld\n",query(x,y));
}
}
return 0;
}
【分块】
最新推荐文章于 2021-05-30 16:18:15 发布