間隔の合計を見つける
トピックリンク:ybt効率的な高度な4-4-1
一般的なアイデア
最初はすべて0である配列を指定し、単一点の加算と区間の合計の2つの操作を実装する必要があります。
アイデア
言うまでもなく、直接線分ツリーはアップ操作のみを必要とします。
コード
#include<cstdio>
#define ll long long
using namespace std;
struct Tree {
ll x, lazy;
}tree[800001];
int n, m;
int op, x, y;
void up(int now) {
tree[now].x = tree[now << 1].x + tree[now << 1 | 1].x;
}
void add(int now, int l, int r, int pl, int add_num) {
if (l == r) {
tree[now].x += add_num;
return ;
}
int mid = (l + r) >> 1;
if (pl <= mid) add(now << 1, l, mid, pl, add_num);
else add(now << 1 | 1, mid + 1, r, pl, add_num);
up(now);
}
ll get_sum(int now, int l, int r, int L, int R) {
if (L <= l && r <= R) return tree[now].x;
int mid = (l + r) >> 1;
ll re = 0;
if (L <= mid) re += get_sum(now << 1, l, mid, L, R);
if (mid + 1 <= R) re += get_sum(now << 1 | 1, mid + 1, r, L, R);
return re;
}
int main() {
scanf("%d %d", &n, &m);
for (int i = 1; i <= m; i++) {
scanf("%d %d %d", &op, &x, &y);
if (op == 0) add(1, 1, n, x, y);
else printf("%lld\n", get_sum(1, 1, n, x, y));
}
return 0;
}