社区讨论

这道题RE了三个点

P3374【模板】树状数组 1参与者 6已保存回复 13

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
13 条
当前快照
1 份
快照标识符
@mi7w1b0j
此快照首次捕获于
2025/11/21 04:32
4 个月前
此快照最后确认于
2025/11/21 06:31
4 个月前
查看原帖
哪位大佬知道咋回事啊
CPP
#include <iostream>
using namespace std;
#define MAX 500010
int a[MAX],sumv[MAX],v,n,m,p,pd,ql,qr,sum = 0;
int build_tree(int o,int l,int r){
	int mid = l + (r - l) / 2;	
	if(l == r){
		sumv[o] = a[l];
	}else{
		sumv[o] = build_tree(o * 2,l,mid) + build_tree(o * 2 + 1,mid + 1,r);
	}	
	return sumv[o];
}
void query(int o,int l,int r){
	int mid = l + (r - l) / 2;
	if(ql <= l && qr >= r){
		sum += sumv[o];
	}else{
		if(ql <= mid){
			query(o * 2,l,mid);
		}
		if(qr > mid){
			query(o * 2 + 1,mid + 1,r);
		}
	}
}
void update(int o,int l,int r){
	int mid = l + (r - l) / 2;
	if(l == r){
		sumv[o] += v;
	}else{
		if(p <= mid){
			update(o * 2,l,mid);
		}
		if(p > mid){
			update(o * 2 + 1,mid + 1,r);
		}
		sumv[o] = sumv[o * 2] + sumv[o * 2 + 1];
	}
}
int main(){
	cin>>n;
	cin>>m;
	for(int i = 1;i <= n;i++){
		cin>>a[i];
	}
	sumv[1] = build_tree(1,1,n);
	while(m--){
		int a,b;
		cin>>pd>>a>>b;
		if(pd == 1){
			p = a;
			v = b;
			update(1,1,n);
		}
		if(pd == 2){
			ql = a;
			qr = b;
			sum = 0;
			query(1,1,n);
			cout<<sum<<endl;
		}
	}
	return 0;
}

回复

13 条回复,欢迎继续交流。

正在加载回复...