【题目描述】
给定一个全部为零的数列,规定有两种操作,一是修改某个元素,二是求区间的连续和。
【输入】
输入数据第一行包含两个正整数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
【输出样例】
10
6
0
6
16
6
24
14
50
41
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e5 + 5;
ll n, m;
ll a[N];
ll sum[4 * N];
void build(int k, int l, int r) {
if (l == r) {
return;
}
int mid = (l + r) / 2;
build(k * 2, l, mid);
build(k * 2 + 1, mid + 1, r);
sum[k] = sum[k * 2] + sum[k * 2 + 1];
}
void change(int k, int l, int r, int x, int y) {
if (x > r || x < l) return;
if (l == r && l == x) {
sum[k] += y ;
return;
}
int mid = (l + r) / 2;
change(k * 2, l, mid, x, y);
change(k * 2 + 1, mid + 1, r, x, y);
sum[k] = sum[k * 2] + sum[k * 2 + 1];
}
ll query_sum(int k, int l, int r, int x, int y) {
if (x > r || y < l) {
return 0;
}
if (x <= l && y >= r) {
return sum[k];
}
ll res = 0;
int mid = (l + r) / 2;
res += query_sum(k * 2, l, mid, x, y) + query_sum(k * 2 + 1, mid + 1, r, x, y);
return res;
}
int main() {
scanf("%lld%lld",&n,&m);
for (int i = 1; i <= n; i++) {
a[i] = 0;
}
build(1, 1, n);
for (int i = 1; i <= m; i++) {
int k, x, y;
scanf("%d%d%d", &k, &x, &y);
if (k == 0) change(1, 1, n, x, y);
if (k == 1) printf("%lld\n",query_sum(1, 1, n, x, y));
}
return 0;
}