线段树30分求调
查看原帖
线段树30分求调
754444
tamamocross楼主2022/12/1 17:51
#include<iostream>
const int Max=1e6+1;
using namespace std;
long long element[Max];
struct segment_tree{
	struct Node{
		int left,right,sum;
	}Tree[4*Max+5];
	void Build(int i,int l,int r){
	Tree[i].sum=0,Tree[i].left=l,Tree[i].right=r;
	//cout<<"i="<<i<<","<<"l="<<l<<" "<<"r="<<r<<endl;
	if(l==r){
		Tree[i].sum=element[l];
		return;
	}
	int mid=l+((r-l)>>2);//除2
	Build((i<<1),l,mid);
	Build((i<<1)+1,mid+1,r);
	Tree[i].sum=Tree[(i<<1)].sum+Tree[(i<<1)+1].sum;
	}
	void Add(int i,int n,int ad){
	if(Tree[i].left==Tree[i].right){
		Tree[i].sum+=ad;
		return;
	}
	if(n<=Tree[(i<<1)].right){
		Add((i<<1),n,ad);
	}else{
		Add((i<<1)+1,n,ad);
	}
	Tree[i].sum=Tree[(i<<1)].sum+Tree[(i<<1)+1].sum;
	return;
	}
	int Search(int i,int l,int r){
	if(l<=Tree[i].left&&Tree[i].right<=r){
		return Tree[i].sum;
	}
	if(l>Tree[i].right||r<Tree[i].left){
		return 0;
	}
	int s=0;
	if(l<=Tree[(i<<1)].right){
		s+=Search((i<<1),l,r);
	}
	if(r>=Tree[(i<<1)].left){
		s+=Search((i<<1)+1,l,r);
	}
	return s;
	}
}ST;


int main(){
	int n,opo_num;
	std::ios::sync_with_stdio(0);
	cin>>n>>opo_num;//数的数目和操作数目 
	for(int i=1;i<=n;i++){
		cin>>element[i];
	}
	ST.Build(1,1,n);
	int l,r,ad;
	for(int i=1;i<=opo_num;i++){
		int opo;//操作符 
		cin>>opo;
		if(opo==1){//1代表将第n个数字加k ,2代表输出[x,y]的和 
			cin>>n>>ad;
			ST.Add(1,n,ad);
		}else{
			cin>>l>>r;
			cout<<ST.Search(1,l,r)<<'\n';
		} 
	}
}
2022/12/1 17:51
加载中...