RT,代码如下:
#include <bits/stdc++.h>
using namespace std;
const int kMaxn = 2e5 + 5;
int n, m, a[kMaxn];
struct Segment_tree {
int t[kMaxn * 4], tag[kMaxn * 4];
Segment_tree() {
memset( t, 0, sizeof( t ) );
memset( tag, 0, sizeof( tag ) );
}
void push_up( int u ) {
t[u] = t[u * 2] + t[u * 2 + 1];
}
void biuld( const int a[], int u, int l, int r ) {
if( l == r ) {
t[u] = a[l];
return ;
}
int mid = ( l + r ) >> 1;
biuld( a, u * 2, l, mid );
biuld( a, u * 2 + 1, mid + 1, r );
push_up( u );
}
void addtag( int u, int l, int r ) {
t[u] = r - l + 1 - t[u];
tag[u] ^= 1;
}
void push_down( int u, int l, int r ) {
int mid = ( l + r ) >> 1;
addtag( u * 2, l, mid );
addtag( u * 2 + 1, mid + 1, r );
tag[u] = 0;
}
void update( int u, int l, int r, int L, int R ) {
if( l > R || r < L ) {
return ;
}
if( L <= l && r <= R ) {
addtag( u, l, r );
return ;
}
push_down( u, l, r );
int mid = ( l + r ) >> 1;
update( u * 2, l, mid, L, R );
update( u * 2 + 1, mid + 1, r, L, R );
push_up( u );
}
int query( int u, int l, int r, int L, int R ) {
if( tag[u] ) {
push_down( u, l, r );
}
if( L <= l && r <= R ) {
return t[u];
}
if( l > R || r < L ) {
return 0;
}
int mid = ( l + r ) >> 1;
// push_down( u, l, r );
return query( u * 2, l, mid, L, R ) + query( u * 2 + 1, mid + 1, r, L, R );
}
}T;
int main() {
cin >> n >> m;
for( int i = 1; i <= n; i ++ ) {
char c;
cin >> c;
a[i] = c - '0';
}
T.biuld( a, 1, 1, n );
for( int i = 1; i <= m; i ++ ) {
int x, y, op;
cin >> op;
if( op ) {
cin >> x >> y;
cout << T.query( 1, 1, n, x, y ) << endl;
}
else {
cin >> x >> y;
T.update( 1, 1, n, x, y );
}
}
}