信息学奥赛一本通 1535:【例 1】数列操作
【题目链接】
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';elseupdate(a, b);}return 0;
}