过了一个点 样例点数据错了 写了print
#include<iostream>
using namespace std;
int n,m,a[100010],sum[400040],l[400040],r[400040],add[400040],x,y,k,q;
void make(int p,int le,int ri)
{
l[p]=le,r[p]=ri;
if(le==ri)
{
sum[p]=a[le];
return;
}
int mid=(ri+le)>>1;
make(p*2,le,mid);
make(p*2+1,mid+1,ri);
sum[p]=sum[p*2]+sum[p*2+1];
}
void print(int p)
{
cout<<p<<" "<<l[p]<<" "<<r[p]<<" "<<sum[p]<<" "<<add[p]<<endl;
if(l[p]==r[p])return ;
print(p*2);
print(p*2+1);
}
void pud(int p)
{
if(add[p]!=0)
{
int pp=p*2;
if(r[p]!=l[p])
{
add[p*2]+=add[p];
add[p*2+1]+=add[p];
sum[pp]+=add[pp]*(r[pp]-l[pp]+1);
sum[pp+1]+=add[pp+1]*(r[pp+1]-l[pp+1]+1);
}
add[p]=0;
}
}
int search(int p,int le,int ri)
{
pud(p);
if(l[p]>=le&&r[p]<=ri)return sum[p];
int mid=(r[p]+l[p])>>1;
if(mid<le)return search(p*2+1,le,ri);
else if(mid>=ri)return search(p*2,le,ri);
else return search(p*2+1,le,ri)+search(p*2,le,ri);
}
void change(int p,int le,int ri,int d)
{
if(l[p]>=le&&r[p]<=ri)
{
add[p]+=d;
sum[p]+=d*(r[p]-l[p]+1);
return;
}
pud(p);
int mid=(r[p]+l[p])>>1;
if(mid<le)change(p*2+1,le,ri,d);
else if(mid>=ri)change(p*2,le,ri,d);
else change(p*2+1,le,ri,d),change(p*2,le,ri,d);
sum[p]=sum[p*2]+sum[p*2+1];
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
make(1,1,n);
cout<<endl;
print(1);
cout<<endl;
for(int i=1;i<=m;i++)
{
cin>>q>>x>>y;
if(q==1)
{
cin>>k;
change(1,x,y,k);
cout<<endl;
print(1);
cout<<endl;
}
if(q==2)
{
cout<<search(1,x,y)<<endl;
}
}
}