请编写程序对数组a1,a2,...,an进行如下操作 :
1 i x:给定i,x,将ai 加上x ;
2 l r:给定l,r,求al+al+1+...+ar的值。
输入格式:
第一行包含2个正整数n和q,表示数组长度和查询个数。保证1≤n,q≤106。 第二行n个整数a1,a2,...,an,表示初始数组。保证∣ai∣≤106。 接下来q行,每行为一个操作。 保证 1≤l≤r≤n,∣x∣≤106。
输出格式:
对于每个 2 l r 操作输出一行,每行有一个整数,表示所求的结果。
输入样例:
3 2
1 2 3
1 2 0
2 1 3
输出样例:
6
思路:树状数组的基本应用,数据应该用 long long
参考:7-11 动态区间求和 (10 分)_Baifeili的博客-优快云博客
关于树状数组
树状数组的本职是单点修改+区间查询 维护前缀和 每次修改向上传数据 然后查询区间的时候也是从下往上加值
关于lowbit函数:
lowbit()函数用来取一个二进制最低位的一与后边的0组成的数
int lowbit(int x)
{
return x&(-x);
}
AC代码
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
const int MAXN = 1e6 + 5;
ll n, q, c[MAXN];//树状数组, 下标为某一个元素, 值为这个元素出现的次数
int lowbit(int x) {
return x&(-x);
}
//update将第x个整数加上v
void update(int x, int v)
{
for (int i = x; i <= n; i += lowbit(i)) {
c[i] += v;
}
}
//getSum返回前x个整数之和
ll getSum(int x) {
ll sum = 0;
for (int i = x; i > 0; i -= lowbit(i)) {
sum += c[i];
}
return sum;
}
int main()
{
cin >> n >> q;
memset(c, 0, sizeof(c));
for (int i = 1; i <= n; i++) {
int temp;
cin >> temp;
update(i, temp);
}
while (q--)
{
int a, b, c;
cin >> a >> b >> c;
if (a == 1) {
update(b, c);
}
else if (a == 2) {
cout << getSum(c) - getSum(b - 1) << endl;
}
}
}