【题目链接】
ybt 1535:【例 1】数列操作
【题目考点】
1. 树状数组
【解题思路】
本题为树状数组模板题,维护区间和,进行单点修改,区间查询。
详细讲解见:洛谷 P3374 【模板】树状数组 1(树状数组解法)
【题解代码】
#include <bits/stdc++.h>
using namespace std;
#define N 100005
int tree[N], n, m;//tree:树状数组
int lowbit(int x)
{
return x & -x;
}
void update(int i, int v)//a[i] += v 单点修改
{
for(int x = i; x <= n; x += lowbit(x))
tree[x] += v;
}
int sum(int i)//求a[1]+...+a[i] 区间查询
{
int s = 0;
for(int x = i; x > 0; x -= lowbit(x))
s += tree[x];
return s;
}
int query(int l, int r)//求a序列区间和[l, r]
{
return sum(r)-sum(l-1);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int a, k, b;
cin >> n >> m;
for(int i = 1; i <= n; ++i)
{
cin >> a;
update(i, a);
}
for(int i = 1; i <= m; ++i)
{
cin >> k >> a >> b;
if(k == 0)
cout << query(a, b) << '\n';
else
update(a, b);
}
return 0;
}