#谢谢各位了!!
cpp
#include <iostream>
#include <math.h>
#define ll long long
using namespace std;
int main() {
ll n,m; //分别表示该数列数字的个数和操作的总个数。
cin>>n>>m;
ll a[10005]={0};
ll sta[1005]={0};
ll end[1005]={0};
ll belong[10005]={0};
ll num=sqrt(n);
for (ll i=1; i<=n; i++) {
cin>>a[i];
}
//标记起点和终点
for (ll i=1; i<=num; i++) {
sta[i]=n/num*(i-1)+1;
end[i]=n/num*i;
}
end[num]=n;
//设计belong数组
for (ll i=1; i<=num; i++) {
for (ll j=sta[i]; j<=end[i]; j++) {
belong[j]=i;
}
}
//设计size数组
ll size[1005]={0};
for (ll i=1; i<=num; i++) {
ll step=end[i]-sta[i]+1;
size[i]=step;
}
//设计sum数组
ll Sum[1005]={0};
for (ll i=1; i<=num; i++) {
ll s=0;
for (ll j=sta[i]; j<=end[i]; j++) {
s+=a[j];
}
Sum[i]=s;
}
//下面是操作
for (int i=1; i<=m; i++) {
int t;
cin>>t;
if(t==1){
ll L,R,W;
cin>>L>>R>>W; //这里有一个层次的问题,L,R都是表层
ll x=belong[L];
ll y=belong[R];
if(x==y){
for (ll j=L; j<=R; j++) {
a[j]+=W;
}
size[x]+=W*(R-L+1);
}
else{
//1 修改L对应的那个数组
for (ll j=L; j<=end[belong[L]]; j++) {
a[j]+=W;
}
Sum[belong[L]]+=W*(end[belong[L]]-L+1);
//2 修改R对应的那个数组
for (ll j=R; j>=sta[belong[R]]; j--) {
a[j]+=W;
}
Sum[belong[R]]+=W*(R-sta[belong[L]]+1);
//3 修改中间的对应区块
for (ll j=belong[L]+1; j<belong[R]; j++) {
for (ll p=sta[j]; p<=end[j]; p++) {
a[p]+=W;
}
Sum[j]+=size[j]*W;
}
}
}
else{
ll L,R;
cin>>L>>R;
ll x=belong[L];
ll y=belong[R];
if(x==y){
ll sum=0;
for (ll j=L; j<=R; j++) {
sum+=a[j];
}
cout<<sum<<endl;
}
else{
ll sum=0;
for (ll j=L; j<=end[belong[L]]; j++) {
sum+=a[j];
}
for (ll j=R; j>=sta[belong[R]]; j--) {
sum+=a[j];
}
for (ll j=belong[L]+1; j<belong[R]; j++) {
sum+=Sum[j];
}
cout<<sum<<endl;
}
}
}
return 0;
}