线段树求调
  • 板块学术版
  • 楼主WD2c0mP
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/2/7 12:42
  • 上次更新2023/10/24 01:29:16
查看原帖
线段树求调
780641
WD2c0mP楼主2023/2/7 12:42

P3374 【模板】树状数组1 0pts求调!!

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[500010],f[2000010];
void buildtree(ll k,ll l,ll r) {
	if (l == r) {
		f[k] = a[l];
		return ;
	}
	ll mid = (l + r) >> 1;
	buildtree(k + k,l,mid);
	buildtree(k + k + 1,mid + 1,r);
	f[k] = f[k + k] + f[k + k + 1]; 
}
ll query(ll k,ll l,ll r,ll x,ll y) {
	if (l == x && r == y) {
		return f[k];
	}
	ll mid = (l + r) >> 1;
	if (y <= mid) {
		return query(k + k,l,mid,x,y);
	} else if (x > mid) {
		return query(k + k + 1,mid + 1,r,x,y);
	} else {
		return query(k + k,l,mid,x,mid) + query(k + k + 1,mid + 1,r,mid + 1,y);
	}
}
void update(ll k,ll l,ll r,ll val,ll w) {
	f[k] = val;
	if (l == r) {
		return ;
	}
	ll mid = (l + r) >> 1;
	if (w <= mid) {
		update(k + k,l,mid,val,w);
	} else {
		update(k + k + 1,mid + 1,r,val,w);
	}
}
int main(){
	ll n,m;
	cin >> n >> m;
	for (int i = 1;i <= n;i ++) cin >> a[i];
	buildtree(1,1,n);
	while (m --) {
		int pos,x,y;
		cin >> pos >> x >> y;
		if (pos == 1) {
			update(1,1,n,y,x);
		} else {
			cout << query(1,1,n,x,y) << endl;
		}
	} 
	return 0;
}
2023/2/7 12:42
加载中...