10pts!初学线段树蒟蒻求调!!!悬棺
查看原帖
10pts!初学线段树蒟蒻求调!!!悬棺
596448
_Ayanami_Rei_楼主2023/11/4 16:30
#include <cstdio>
using namespace std;

#define ls(p) (p << 1)
#define rs(p) (p << 1 | 1)
#define int long long
int t[400005], tag[400005];

void add_tag (int p, int pl, int pr) {
	tag[p] = 1;
	t[p] = (pr - pl + 1) - t[p];
}

void push_down (int p, int pl, int pr) {
	if (tag[p]) {
		int mid = (pl + pr) / 2;
		add_tag (ls(p), pl, mid);
		add_tag (rs(p), mid + 1, pr);
		tag[p] = 0;
	}
}

void Update (int l, int r, int p, int pl, int pr) {
	if (l <= pl && pr <= r) {
		add_tag (p, pl, pr);
		return ;
	}
	push_down(p, pl, pr);
	int mid = (pl + pr) / 2;
	if (l <= mid) {
		Update (l, r, ls(p), pl, mid);
	}
	if (r > mid) {
		Update (l, r, rs(p), mid + 1, pr);
	}
	t[p] = t[ls(p)] + t[rs(p)];
}

int count (int l, int r, int p, int pl, int pr) {
	if (l <= pl && pr <= r) {
		return t[p];
	}
	push_down(p, pl, pr);
	int res = 0;
	int mid = (pl + pr) / 2;
	if (l <= mid) {
		res += count (l, r, ls(p), pl, mid);
	}
	if (r > mid) {
		res += count (l, r, rs(p), mid + 1, pr);
	}
	return res;
}

signed main () {
	int n, m;
	scanf ("%lld %lld", &n, &m);
	while (m--) {
		int c, a, b;
		scanf ("%d %d %d", &c, &a, &b);
		if (c == 0) {
			Update(a, b, 1, 1, n);
		} else {
			printf("%d\n", count(a, b, 1, 1, n));
		}
	}
	return 0;
}
2023/11/4 16:30
加载中...