正常情况下线段树不是开 4N 的空间就够了吗,可是如果把下面的 tr[5*NR] 改成 tr[4*NR] 就会直接炸三个点 (#2 #9 #10),这是为啥?
我代码是不是少了些什么?
求神犇 qwq
#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[500005];
namespace STR{
const int NR=5e5+5;
struct Node{
int v;
int l,r;
Node(){
v=l=r=0;
}
}tr[5*NR];
void pushup(int id){
tr[id].v=tr[id*2].v+tr[id*2+1].v;
}
void build(int l,int r,int id){
tr[id].l=l;
tr[id].r=r;
if(l==r){
tr[id].v=a[l];
return;
}
int mid=(l+r)>>1;
build(l,mid,id*2);
build(mid+1,r,id*2+1);
pushup(id);
}
int query(int l,int r,int id){
if(l<=tr[id].l&&tr[id].r<=r){
return tr[id].v;
}
int t1=0,t2=0;
if(tr[id].r!=0&&tr[id].r>=l){
t1=query(l,r,id*2);
}
if(tr[id].l!=0&&tr[id].l<=r){
t2=query(l,r,id*2+1);
}
return t1+t2;
}
void update(int x,int v,int id){
if(tr[id].l==x&&tr[id].r==x){
tr[id].v+=v;
return;
}
int mid=(tr[id].l+tr[id].r)>>1;
if(x<=mid){
update(x,v,id*2);
}
else{
update(x,v,id*2+1);
}
pushup(id);
}
}
int main(){
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
STR::build(1,n,1);
while(m--){
int op,x,y;
scanf("%d %d %d",&op,&x,&y);
if(op==1){
STR::update(x,y,1);
}
else{
printf("%d\n",STR::query(x,y,1));
}
}
return 0;
}