线段树,但是下沉标记是直接写在print函数里的
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n, m, a[101010], tree[401010];
bool lan[401010];
void build(int id, int l, int r){
if(l == r){
tree[id] = 0;
return;
}
int mid = (l + r) / 2;
build(id * 2, l, mid); build(id * 2 + 1, mid + 1, r);
tree[id] = tree[id * 2] + tree[id * 2 + 1];
}
void change(int id, int l, int r, int x, int y){
if(x > r || y < l) return;
// x = max(l, x); y = min(r, y);
if(l >= x && r <= y){
tree[id] = (r - l + 1) - tree[id];
lan[id] = !lan[id];
return;
}
int mid = (l + r) / 2;
change(id * 2, l, mid, x, y); change(id * 2 + 1, mid + 1, r, x, y);
tree[id] = tree[id * 2] + tree[id * 2 + 1];
return;
}
int print(int id, int l, int r, int x, int y, bool k){
if(k){
tree[id] = (r - l + 1) - tree[id];
lan[id] = !lan[id];
}
if(x > r || y < l) return 0;
// x = max(l, x); y = min(r, y);
if(l >= x && r <= y){
return tree[id];
}
int mid = (l + r) / 2; k = lan[id];
lan[id] = 0;
return print(id * 2, l, mid, x, y, k) + print(id * 2 + 1, mid + 1, r, x, y, k);
}
signed main(){
cin >> n >> m;
build(1, 1, n);
while(m--){
int f, x, y;
cin >> f;
if(f == 0){
cin >> x >> y;
change(1, 1, n, x, y);
}
if(f == 1){
cin >> x >> y;
cout << print(1, 1, n, x, y, 0) << endl;
}
}
// cout << tree[4] << " " << tree[5] << " " << tree[12] << " " << tree[13] << " " << tree[7];
return 0;
}