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;
}