代码:
#include<bits/stdc++.h>
using namespace std;
int b[505][505],sum[505],rt[505],s[505],id[100005],Len,N;
inline void add(int l,int r,int x){
int L=l%Len,R=r%Len,lid=id[l],rid=id[r];
L=((!L)?Len:L),R=((!R)?Len:R);
if(lid==rid){
for(int i=L;i<=R;i++)
b[lid][i]+=(i-L+1)*x;
for(int i=R+1;i<=s[lid];i++)
b[lid][i]+=(R-L+1)*x;
}else{
for(int i=L;i<=s[lid];i++)
b[lid][i]+=(i-L+1)*x;
for(int i=1;i<=R;i++)
b[rid][i]+=i*x;
for(int i=R+1;i<=s[rid];i++)
b[rid][i]+=R*x;
for(int i=lid+1;i<=rid-1;i++)
sum[i]+=(i-lid)*x,rt[i]+=x;
for(int i=rid;i<=N;i++)
sum[i]+=(rid-lid-1)*x;
}
}
inline int qry(int l,int r){
int L=l%Len,R=r%Len,lid=id[l],rid=id[r];
L=((!L)?Len:L),R=((!R)?Len:R);
if(lid==rid)return b[lid][R]-b[lid][L-1];
else return sum[rid-1]-sum[lid]+b[rid][R]+rt[rid]*R+(b[lid][s[lid]]-b[lid][L-1]+rt[rid]*(s[lid]-L+1));
}
int main(){
int n,m,len(0),p(1),Sum(0);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
b[p][++len]=x+b[p][len-1],Sum+=x,id[i]=p;
if(len*len>=n)s[p]=len,sum[p]=sum[p-1]+Sum,Sum=len=0,p++;
}
s[p]=len,sum[p]=sum[p-1]+Sum,Sum=len=0,Len=s[1],N=p;
while(m--){
int op,l,r,x;
scanf("%d",&op);
if(op&1){
scanf("%d%d%d",&l,&r,&x);
add(l,r,x);
}else{
scanf("%d%d",&l,&r);
printf("%d\n",qry(l,r));
}
}
return 0;
}