线段树
  • 板块学术版
  • 楼主封禁用户
  • 当前回复6
  • 已保存回复6
  • 发布时间2021/7/19 15:00
  • 上次更新2023/11/4 14:11:09
查看原帖
线段树
461366
封禁用户楼主2021/7/19 15:00
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = 1e5 + 5;
int n, m, a[N], tree[N * 4], lzy[N * 4];

void push_up(int rt) {
	tree[rt] = tree[rt * 2] + tree[rt * 2 + 1];
}

void push_down(int rt) {
	if (lzy[rt]) {
		lzy[rt * 2] += lzy[rt];
		lzy[rt * 2 + 1] += lzy[rt];
		a[rt * 2] += lzy[rt];
		a[rt * 2 + 1] += lzy[rt];
		lzy[rt] = 0;
	}
}

void build(int rt, int l, int r) {
	if (l == r) tree[rt] = a[l];
	else {
		int m = (l + r) / 2;
		build(rt * 2, l, m);
		build(rt * 2 + 1, m + 1, r);
		push_up(rt);
	}
}

void update(int L, int R, int v, int l, int r, int k) {
	if (L <= l && r <= R) {
		tree[k] += v;
		a[k] += v;
	} else {
		push_down(k);
		int m = (l + r) / 2;
		if (L <= m) update(L, R, v, l, m, k * 2);
		if (R > m) update(L, R, v, m + 1, r, k * 2 + 1);
		push_up(k);
	}
}

int query(int L, int R, int l, int r, int k) {
	if (L <= l && r <= R) return tree[k];
	else {
		push_down(k);
		int m = (l + r) / 2, ans = 0;
		if (L <= m) ans += query(L, R, l, m, k * 2);
		if (R > m) ans += query(L, R, m + 1, r, k * 2 + 1);
		return ans;
	}
}

signed main() {
	cin >> n >> m;
	for (int i = 1; i <= n; i++) cin >> a[i];
	build(1, 1, n);
	while (m--) {
		int op; cin >> op;
		if (op == 1) {
			int x, y, z;
			cin >> x >> y >> z;
			update(x, y, z, 1, n, 1);
		} else {
			int x, y;
			cin >> x >> y;
			cout << query(x, y, 1, n, 1) << endl;
		}
	}
}

求教模板题

2021/7/19 15:00
加载中...