我不李姐 [玄关]
查看原帖
我不李姐 [玄关]
766436
Mr_RedStone楼主2024/7/11 22:10

正常情况下线段树不是开 4N4N 的空间就够了吗,可是如果把下面的 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;
}
2024/7/11 22:10
加载中...