WA了8910三个点,检查一遍把所有int都改成了ll,但是还是在8910中会输出一个负数
#include<bits/stdc++.h>
#define ll long long
#define MAX 200000
using namespace std;
ll num[200001];
struct node
{
ll l,r,tot,add;
}tree[MAX*4];
void link(int n)
{
tree[n].tot=tree[n*2].tot+tree[n*2+1].tot;
}
void spread(int n)
{
tree[n*2].tot+=tree[n].add*(tree[n*2].r-tree[n*2].l+1);
tree[n*2+1].tot+=tree[n].add*(tree[n*2+1].r-tree[n*2+1].l+1);
tree[n*2].add+=tree[n].add;
tree[n*2+1].add+=tree[n].add;
tree[n].add=0;
}
void build(int n,int le,int ri)
{
tree[n].l=le;
tree[n].r=ri;
if(le==ri)
{
tree[n].tot=num[le];
return;
}
ll mid=(le+ri)>>1;
build(n*2,le,mid);
build(n*2+1,mid+1,ri);
link(n);
}
void change(int n,int le,int ri,int d)
{
if(tree[n].l>=le&&tree[n].r<=ri)
{
tree[n].tot+=d*(tree[n].r-tree[n].l+1);
tree[n].add+=d;
return;
}
spread(n);
ll mid=(tree[n].l+tree[n].r)>>1;
if(le<=mid)
{
change(n*2,le,ri,d);
}
if(ri>mid)
{
change(n*2+1,le,ri,d);
}
link(n);
}
int ask(int n,int le,int ri)
{
if(tree[n].l>=le&&tree[n].r<=ri)
{
return tree[n].tot;
}
spread(n);
ll res=0,mid=(tree[n].l+tree[n].r)>>1;
if(le<=mid)
{
res+=ask(n*2,le,ri);
}
if(ri>mid)
{
res+=ask(n*2+1,le,ri);
}
return res;
}
int main()
{
ll n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
scanf("%lld",&num[i]);
}
build(1,1,n);
ll x,y,z,q;
for(ll i=1;i<=m;i++)
{
cin>>x;
if(x==1)
{
cin>>y>>z>>q;
change(1,y,z,q);
}
if(x==2)
{
cin>>y>>z;
cout<<ask(1,y,z)<<endl;
}
}
return 0;
}