各位大佬义父们,救救70t的孩子吧
查看原帖
各位大佬义父们,救救70t的孩子吧
575212
sjcdsg123楼主2022/9/4 13:24

这是线段树吧,表示十分不理解

#include<iostream>
using namespace std;
const int N=1000010;
struct{
	int l,r,sum;
}tree[4*N];
void build_tree(int now,int li,int ri){
	tree[now].l=li,tree[now].r=ri;
	if(li==ri){
		scanf("%d",&tree[now].sum);
		return ;
	} 
	int mid=(li+ri)/2;
	build_tree(now*2+1,li,mid);
	build_tree(now*2+2,mid+1,ri);
	tree[now].sum=tree[now*2+1].sum+tree[now*2+2].sum;
	return ;
}
void insert(int now,int li,int ri,int k){
	if(tree[now].l==tree[now].r){
		tree[now].sum+=k;
		return ;
	}
	int mid=(tree[now].l+tree[now].r)/2;
	if(ri<=mid){
		insert(now*2+1,li,ri,k);
	}else if(li>mid){
		insert(now*2+2,li,ri,k);
	}else{
		insert(now*2+2,mid+1,ri,k);
		insert(now*2+1,li,mid,k);
	}
	tree[now].sum=tree[now*2+1].sum+tree[now*2+2].sum;
}
int query(int now,int l,int r){
      if(l==tree[now].l&&r==tree[now].r) return tree[now].sum;
	  int mid=(tree[now].l+tree[now].r)/2;
	  if(r<=mid) return query(now*2+1,l,r); 
	  else if(l>mid) return query(now*2+2,l,r);
	  else{
	  	return query(now*2+1,l,mid)+query(now*2+2,mid+1,r);
	  }
}
void print(int now){
	cout<<tree[now].l<<' '<<tree[now].r<<' '<<tree[now].sum<<endl;
	if(tree[now].l==tree[now].r) return ;
	print(now*2+1);
	print(now*2+2);
}
int main(){
	int n,m;
	cin>>n>>m;
	build_tree(0,1,n);
	while(m--){
		int a;
		cin>>a;
		int l,r;
		if(a==1){
			int k;
			cin>>l>>r>>k;
			insert(0,l,r,k);
		}else{
			cin>>l>>r;
			cout<<query(0,l,r)<<endl;
		}
	}
}
2022/9/4 13:24
加载中...