检查了很久,找不到那里出错了,求助
#include <cstdio>
using namespace std;
struct Node
{
int l,r;
long long lazy,sum;
}tree[400010];
int k,k1,m1,i,n,m;
long long s[100010],ans,v;
void build(int p,int l,int r)
{
tree[p].l=l;
tree[p].r=r;
tree[p].sum=s[r]-s[l-1];
if (l<r)
{
int mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
}
return;
}
void treeans(int p)
{
if ((tree[p].l>=k)&&(tree[p].r<=k1))
{
ans+=tree[p].sum;
return;
}
if (tree[p].l!=tree[p].r)
{
tree[p<<1].sum+=(tree[p<<1].r-tree[p<<1].l+1)*tree[p].lazy;
tree[p<<1|1].sum+=(tree[p<<1|1].r-tree[p<<1|1].l+1)*tree[p].lazy;
tree[p<<1].lazy+=tree[p].lazy;
tree[p<<1|1].lazy+=tree[p].lazy;
tree[p].lazy=0;
}
if ((tree[p].r>k1)&&(tree[p].l>k1)) return;
if ((tree[p].l<k)&&(tree[p].r<k)) return;
treeans(p<<1);
treeans(p<<1|1);
}
void treeinc(int p)
{
if ((tree[p].l>=k)&&(tree[p].r<=k1))
tree[p].sum+=(tree[p].r-tree[p].l+1)*v,tree[p].lazy+=v;
if ((tree[p].r>k1)&&(tree[p].l>k1)) return;
if ((tree[p].l<k)&&(tree[p].r<k)) return;
treeinc(p<<1);
treeinc(p<<1|1);
}
int main()
{
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++)
{
scanf("%d",&s[i]);
s[i]+=s[i-1];
}
build(1,1,n);
for (i=1;i<=m;i++)
{
scanf("%d",&m1);
if (m1==1)
{
scanf("%d%d%d",&k,&k1,&v);
treeinc(1);
}
if (m1==2)
{
scanf("%d%d",&k,&k1);
ans=0;
treeans(1);
printf("%lld\n",ans);
}
}
return 0;
}