P3374 【模板】树状数组 1

题目链接

题目描述

如题,已知一个数列,你需要进行下面两种操作:

  • 将某一个数加上 $x$
  • 求出某区间每一个数的和

输入格式

第一行包含两个正整数 $n,m$($1 \le n,m \le 5 \times 10^5$),分别表示该数列数字的个数和操作的总个数。

第二行包含 $n$ 个用空格分隔的整数,其中第 $i$ 个数字表示数列第 $i$ 项的初始值。

接下来 $m$ 行每行包含 $3$ 个整数,表示一个操作,具体如下:

  • 1 x k 含义:将第 $x$ 个数加上 $k$
  • 2 x y 含义:输出区间 $[x,y]$ 内每个数的和

输出格式

输出包含若干行整数,即为所有操作 $2$ 的结果。

题解

树状数组单点修改区间查询模板题,暂无

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5;
int t[N], op, x, y, n, m;
void add(int x, int k) {
for (; x <= n; x += x & -x) t[x] += k;
}
int ask(int x) {
int res(0);
for (; x; x -= x & -x) res += t[x];
return res;
}
int main() {
ios::sync_with_stdio(0);
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> x, add(i, x);
for (int i = 1; i <= m; i++) {
cin >> op >> x >> y;
if (op == 1)
add(x, y);
else
cout << ask(y) - ask(x - 1) << '\n';
}
return 0;
}

注意

  1. 前缀和查询是 $r$ 和 $l-1$
文章作者: answerend42
文章链接: http://answerend42.github.io/2020/11/12/lg3374/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 answerend42的Blog