- [TJOI2009] 开关
- 111
- @ 2024-12-20 20:10:30
#include<iostream>
using namespace std;
int d[(int)5e5], f[(int)5e5];
void pushdamn(int s, int t, int p) {
	int mid = (s + t) >> 1;
	d[p * 2] = (mid - s + 1) - d[p * 2];
	f[p * 2] = !f[p * 2];
	d[p * 2 + 1] = (t - mid) - d[p * 2 + 1];
	f[p * 2 + 1] = !f[p * 2 + 1];
	f[p] = 0;
	return ;
}
void update(int l, int r, int s, int t, int p) {
	if (l <= s && t <= r) {
		f[p] = !f[p];
		d[p] = (t - s + 1) - d[p];
		return;
	}
	if (f[p] && s != t) {
		pushdamn(s, t, p);
	}
	int mid = (s + t) >> 1;
	if (l <= mid)update(l, r, s, mid, p * 2);
	if (mid < r)update(l, r, mid + 1, t, p * 2 + 1);
	d[p] = d[p * 2] + d[p * 2 + 1];
}
int getsum(int l, int r, int s, int t, int p) {
	if (l <= s && t <= r) {
		return d[p];
	}
	pushdamn(s, t, p);
	int mid = (s + t) >> 1;
	int sum = 0;
	if (l <= mid)sum += getsum(l, r, s, mid, p * 2);
	if (mid < r)sum += getsum(l, r, mid + 1, t, p * 2 + 1);
	return sum;
}
int main() {
	int n, m;
	cin >> n >> m;
	while (m--) {
		int c, a, b;
		cin >> c >> a >> b;
		if (c == 0) {
			update(a, b, 1, n, 1);
cout << "\nd:";
for (int i=1;i<=4*n;i++){
	cout << d[i] << " ";
}
cout << "\nf:";
for (int i=1;i<=4*n;i++){
	cout << f[i] << " ";
}
cout << "\n";
		} else {
			cout << getsum(a, b, 1, n, 1) << "\n";
		}
	}
	return 0;
}
0 comments
  
  No comments so far...
            Information
- ID
- 286
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 6
- Tags
- # Submissions
- 34
- Accepted
- 12
- Uploaded By
 
      