线段树,求助
查看原帖
线段树,求助
761185
yuzhanyao楼主2023/6/14 19:22
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
struct TREE{
	int l,r,sum;
}tree[4*N];
int input[N];
int ans;
inline void build(int i,int l,int r){
	tree[i].l=l;tree[i].r=r;
	if(l==r){
		tree[i].sum=input[l];//注意此时 l==r 此处记录是点的值 与 i 无关 
		return;//注意需要返回!!! 
	}
	int mid=(l+r)>>1;
	build(i*2,l,mid);
	build(i*2+1,mid+1,r);
	tree[i].sum=tree[i*2].sum+tree[i*2+1].sum;
}
inline int search_interval(int i,int l,int r){
	int sm=0;
	if(tree[i].l>=l&&tree[i].r<=r)return tree[i].sum;
	if(tree[i].l>r||tree[i].r<l)return 0;
	if(tree[i].l<=r)sm+=search_interval(i*2,l,r);//注意搜索当前节点左儿子的右端点(下同) 
	if(tree[i].r>=l)sm+=search_interval(i*2+1,l,r);
}

inline int edd(int i,int dis,int k){
	if(tree[i].l==tree[i].r)tree[i].sum+=k;
	if(dis<=tree[i*2].r)edd(i*2,dis,k);
	else edd(i*2+1,dis,k);
	tree[i].sum=tree[i*2].sum+tree[i*2+1].sum;
}
inline void edd_interval(int i,int l,int r,int k){
	if(tree[i].l>=l&&tree[i].r<=r){
		tree[i].sum+=k;
		return ;
	}
	if(tree[i*2].r>=l)edd_interval(i*2,l,r,k);
	if(tree[i*2+1].l<=r)edd_interval(i*2+1,l,r,k);
}
inline void search_point(int i,int dis){
	ans+=tree[i].sum;
	if(tree[i].l==tree[i].r){
		return ;
	}
	if(tree[i*2].r>=dis)search_point(i*2,dis);
	if(dis>=tree[i*2+1].l)search_point(i*2+1,dis);
}
int main(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>input[i];
	}
	build(1,1,n);
	while(m--){
		int in;
		cin>>in;
		in--;
		int x,y,k;
		cin>>x;
		if(in){
			ans=0;
			search_point(1,x);
			cout<<ans<<'\n';
		}
		else {
			cin>>y>>k;
			edd_interval(1,x,y,k);
		}
	}
	
	
	
	
	return 0;
}
2023/6/14 19:22
加载中...