这个线段树程序只 AC 了一个点,各位大佬,能不能帮我看看它出了什么问题啊?
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m;
struct st{
ll ls,rs,value,sign;
}tree[500001];
void build(ll x,ll l,ll r)
{
tree[x].ls=l;
tree[x].rs=r;
if(l==r)
{
cin>>tree[x].value;
return;
}
build(x<<1,l,l+r>>1);
build(x<<1|1,(l+r>>1)+1,r);
tree[x].value=tree[x<<1].value+tree[x<<1|1].value;
}
void add(ll x,ll l,ll r,ll k)
{
if(tree[x].ls==l&&tree[x].rs==r)
{
tree[x].value+=(r-l+1)*k;
tree[x].sign+=k;
return;
}
if(r<=tree[x].ls+tree[x].rs>>1)
{
add(x<<1,l,r,k);
}
else if(l>tree[x].ls+tree[x].rs>>1)
{
add(x<<1|1,l,r,k);
}
else
{
add(x<<1,l,tree[x].ls+tree[x].rs>>1,k);
add(x<<1|1,(tree[x].ls+tree[x].rs>>1)+1,r,k);
}
tree[x].value=tree[x<<1].value+tree[x<<1|1].value;
}
int sum(ll x,ll l,ll r)
{
if(tree[x].ls==l&&tree[x].rs==r)
{
return tree[x].value;
}
if(tree[x].sign)
{
tree[x<<1].value+=(tree[x<<1].rs-tree[x<<1].ls+1)*tree[x].sign;
tree[x<<1|1].value+=(tree[x<<1|1].rs-tree[x<<1|1].ls+1)*tree[x].sign;
tree[x<<1].sign+=tree[x].sign;
tree[x<<1|1].sign+=tree[x].sign;
tree[x].sign=0;
}
if(r<=tree[x].ls+tree[x].rs>>1)
{
return sum(x<<1,l,r);
}
else if(l>tree[x].ls+tree[x].rs>>1)
{
return sum(x<<1|1,l,r);
}
else
{
return sum(x<<1,l,tree[x].ls+tree[x].rs>>1)+sum(x<<1|1,(tree[x].ls+tree[x].rs>>1)+1,r);
}
}
int main()
{
cin>>n>>m;
build(1,1,n);
int opt,x,y,k;
for(int i=1;i<=m;i++)
{
cin>>opt;
if(opt==1)
{
cin>>x>>y>>k;
add(1,x,y,k);
}
else
{
cin>>x>>y;
cout<<sum(1,x,y)<<endl;
}
}
return 0;
}