题意:单点更改,给定一个序列,有2种操作,操作1向序列中某个位置加一个值,操作2求给定区间内序列值的和
思路:树状数组模版题,sum[i]=sum[i-lowbit(i)]+c[i],更改时从底向上更新c[i]中的值。
#include<bits/stdc++.h>
#define lowbit(x) (x&-x)
using namespace std;
typedef long long ll;
const ll maxn = 1000005;
ll n, q, a[maxn], c[maxn];
void add(ll x, ll t)
{
for (; x <= n; x += lowbit(x))
c[x] += t;
}
ll sum(ll x)
{
ll s = 0;
for (; x; x -= lowbit(x))
s += c[x];
return s;
}
int main()
{
while (cin >> n >> q) {
for (ll i = 1; i <= n; i++) {
cin >> a[i];
}
for (ll i = 1; i <= n; i++) {
for (ll j = i; j > i-lowbit(i); j--)
c[i] += a[j];
}
for (ll i = 1; i <= q; i++) {
ll j, k, l;
cin >> j >> k >> l;
if (j == 1) {
add(k, l);
}
if (j == 2) {
cout << sum(l)-sum(k-1) << endl;
}
}
}
}