这道题线段树写法求助
查看原帖
这道题线段树写法求助
251779
Beep_Monkey楼主2022/2/11 09:21
#include<bits/stdc++.h>
using namespace std;
int a[100005],sum[400005],n,q;
int x,y,z;
void build(int o,int L,int R){
	if(L==R){
		sum[o]=a[L];
		return ;
	}
	int m=(L+R)/2;
	build(o*2,L,m);
	build(o*2+1,m+1,R);
	sum[o]=sum[o*2]+sum[o*2+1];
}
void update(int o,int L,int R){
	if(L==R){
		sum[o]=a[y]=z;
		return ;
	}
	int m=(L+R)/2;
	if(y<=m) update(o*2,L,m);
	if(z>m) update(o*2+1,m+1,R);
	sum[o]=sum[o*2]+sum[o*2+1];
}
int query(int o,int L,int R){
	if(y<=L && R<=z){
		return sum[o];
	}
	int ans=0;
	int m=(L+R)/2;
	if(y<=m) ans=ans+query(o*2,L,m);
	if(z>m) ans=ans+query(o*2+1,m+1,R);
	return ans;
}
int main(){
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	build(1,1,n);
	for(int i=1;i<=q;i++){
		scanf("%d%d%d",&x,&y,&z);
		if(x==1) update(1,1,n);
		else printf("%d\n",query(1,1,n));
	}
	return 0;
}
2022/2/11 09:21
加载中...