rt,本蒟蒻线段树样例没过求助
#include <iostream>
#define ll long long
using namespace std;
const int maxn=100000;
int n,m,ans,input[500001];
struct node
{
int left,right,num;
}tree[maxn<<2|1];
void build(ll left,ll right,ll index)
{
tree[index].left=left;
tree[index].right=right;
if(left==right) return;
ll mid=(left+right)/2;
build(left,mid,index*2);
build(mid+1,right,index*2+1);
}
int add(ll index)
{
if(tree[index].left==tree[index].right)
{
tree[index].num=input[tree[index].right];
return tree[index].num;
}
tree[index].num=add(index*2)+add(index*2+1);
return tree[index].num;
}
void my_plus(ll index,ll l,ll r,ll k)
{
if(tree[index].left>=l&&tree[index].right<=r)
{
tree[index].num+=k;
return;
}
if(tree[index*2].right>=l) my_plus(index*2,l,r,k);
if(tree[index*2+1].left<=r) my_plus(index*2+1,l,r,k);
}
void search(ll index,ll l,ll r)
{
ans=0;
if(tree[index].left>=l&&tree[index].right<=r)
{
ans+=tree[index].num;
cout<<ans<<endl;
return;
}
if(tree[index*2].right>=l) search(index*2,l,r);
if(tree[index*2+1].left<=r) search(index*2+1,l,r);
}
int main()
{
ll temp,x,y,k;
cin>>n>>m;
build(1,n,1);
for(int i=1;i<=n;i++)
{
cin>>input[i];
add(i);
}
for(int i=1;i<=m;i++)
{
cin>>temp;
if(temp==1)
{
cin>>x>>y>>k;
my_plus(1,x,y,k);
}
else
{
cin>>x>>y;
search(1,x,y);
}
}
return 0;
}