代码如下:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN = 4e5 + 10;
int n , m;
int tree[MAXN];
bool lazy[MAXN];
void pushup(int p) {
tree[p] = tree[p << 1] + tree[p << 1 | 1];
return;
}
void pushdown(int l , int r , int mid , int p) {
if(lazy[p]) {
tree[p << 1] = (mid - l + 1) - tree[p << 1];
tree[p << 1 | 1] = (r - mid) - tree[p << 1 | 1];
lazy[p << 1] = true;
lazy[p << 1 | 1] = true;
lazy[p] = false;
}
return;
}
void change(int l , int r , int x , int y , int p) {
if(x <= l && r <= y) {
tree[p] = (r - l + 1) - tree[p];
if(lazy[p])
lazy[p] = false;
else
lazy[p] = true;
return;
}
int mid = (l + r) >> 1;
pushdown(l , r , mid , p);
if(x <= mid)
change(l , mid , x , y , p << 1);
if(mid < y)
change(mid + 1 , r , x , y , p << 1 | 1);
pushup(p);
return;
}
int sum(int l , int r , int x , int y , int p) {
if(x <= l && r <= y)
return tree[p];
int mid = (l + r) >> 1;
int cnt = 0;
pushdown(l , r , mid , p);
if(x <= mid)
cnt += sum(l , mid , x , y , p << 1);
if(mid < y)
cnt += sum(mid + 1 , r , x , y , p << 1 | 1);
pushup(p);
return cnt;
}
signed main() {
ios::sync_with_stdio(0) , cin.tie(0) , cout.tie(0);
cin >> n >> m;
while(m --) {
int x , a , b;
cin >> x >> a >> b;
if(x == 0)
change(1 , n , a , b , 1);
if(x == 1)
cout << sum(1 , n , a , b , 1) << '\n';
}
return 0;
}