【题目描述】
给定一个全部为零的数列,规定有两种操作,一是修改某个元素,二是求区间的连续和。
【输入】
输入数据第一行包含两个正整数n,m(n≤100000,m≤500000) ,以下是m 行,
每行有三个正整数k,a,b (k=0 或1,a,b≤n ).k=0 时表示将a 处数字加上b ,k=1 时表示询问区间[a,b ]内所有数的和。
【输出】
对于每个询问输出对应的答案。
【输入样例】
10 20
0 1 10
1 1 4
0 6 6
1 4 10
1 8 9
1 4 9
0 10 2
1 1 8
0 2 10
1 3 9
0 7 8
0 3 10
0 1 1
1 3 8
1 6 9
0 5 5
1 1 8
0 4 2
1 2 8
0 1 1
【输出样例】
#include<bits/stdc++.h>
using namespace std;
long long tree[400005], n, m;
void change(int p, int l, int r, int x, int y) {
if (l == r) {
tree[p] += y;
return;
}
int mid = (l + r) / 2;
if (x <= mid) {
change(p + p, l, mid, x, y);
} else {
change(p + p + 1, mid + 1, r, x, y);
}
tree[p] = tree[p + p] + tree[p + p + 1];
}
long long query(int p, int l, int r, int x, int y) {
if (y < l || r < x) {
return 0;
}
if (x <= l && r <= y) {
return tree[p];
}
int mid = (l + r) / 2;
return query(p + p, l, mid, x, y) + query(p + p + 1, mid + 1, r, x, y);
}
int main() {
scanf("%d%d", &n, &m);
while (m--) {
int k, a, b;
scanf("%d%d%d", &k, &a, &b);
if (k) {
printf("%lld\n", query(1, 1, n, a, b));
} else {
change(1, 1, n, a, b);
}
}
return 0;
}