#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<queue>
//#include<map>
#include<vector>
#include<math.h>
using namespace std;
#define int long long
#define forr(i,a,b) for(int i=a;i<=b;i++)
#define repp(i,a,b) for(int i=a;i>=b;i--)
#define INF 1e9
#define ll long long
#define MAXN 200005
const int _x[]={0,1,0,-1,0},_y[]={0,0,1,0,-1};
#define mem(a,n) memset(a,n,sizeof(a));
#define chkmax(a,b) a=a>b?a:b;
#define chkmin(a,b) a=a<b?a:b;
#include<set>
#include<stack>
#define DE puts("check");
int n,m;
int a[MAXN],s[MAXN];
int tag[MAXN],pos[MAXN];
int L[MAXN],R[MAXN];
int sz,tot;
void Inti(){
sz=sqrt(n);
while(++tot){
L[tot]=R[tot-1]+1;
R[tot]=min(sz*tot,n);
forr(i,L[tot],R[tot]){
pos[i]=tot,s[tot]+=a[i];
}
if(R[tot]==n){
break;
}
}
}
void add(int x,int y,int val){
int l=pos[x],r=pos[y];
if(l==r){
forr(i,x,y){
a[i]+=val,s[l]+=val;
}
}
else{
forr(i,x,R[l]){
a[i]+=val,s[l]+=val;
}
forr(i,l+1,r-1){
tag[i]+=val,s[i]+=val*(R[i]=L[i]+1);
}
forr(i,L[r],y){
a[i]+=val,s[r]+=val;
}
}
}
int sum(int x,int y){
int l=pos[x],r=pos[y];
int ans=0;
if(l==r){
forr(i,x,y){
ans+=a[i]+tag[l];
}
}
else{
forr(i,x,R[l]){
ans+=a[i]+tag[l];
}
forr(i,l+1,r-1){
ans+=s[i];
}
forr(i,L[r],y){
ans+=a[i]+tag[r];
}
}
return ans;
}
signed main(){
scanf("%lld%lld",&n,&m);
forr(i,1,n){
scanf("%lld",&a[i]);
}
Inti();
forr(i,1,m){
int opt,x,y,val;
scanf("%lld%lld%lld",&opt,&x,&y);
if(!(opt%2)){
printf("%lld\n",sum(x,y));
}
else{
scanf("%lld",&val);
add(x,y,val);
}
}
}

所以可能是哪里出了问题