那么水一道线段树, 然而我却WA的彻底。
0
1
1
2
wrong answer On line 1 column 1, read 1, expected 0.
P2574_1.in
10 5
1001010110
1 2 3
0 6 9
1 7 10
1 2 5
1 2 7
P2574_1.out
0
1
1
2
现在蒟蒻把这个问题交给了你, 并希望你尽快解决。为了更好让你发 辱 现 骂 蒟蒻的问题, ta 把 ta 的代码给了你
//平凡而显然的线段树
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <fstream>
using namespace std;
#define ls(p) p<<1
#define rs(p) p<<1|1
#define rev(p) tr[p].rev
#define sum0(p) tr[p].sum[0]
#define sum1(p) tr[p].sum[1]
#define M 200010
template <typename T> inline void read(T &x){
int f=1; x=0; char c = getchar();
for(;!isdigit(c); c = getchar()) if(c == '-') f=-f;
for(; isdigit(c); c = getchar()) x = x*10+c-'0';
x *= f; return ;
}
struct stree{
int sum[2], rev;
}tr[M<<2];
inline void pushup(int p){
sum1(p) = sum1(ls(p)) + sum1(rs(p));
sum0(p) = sum0(ls(p)) + sum0(rs(p));
return ;
}
int a[M];
inline void build(int p, int l, int r){
sum1(p) = sum0(p) = rev(p) = 0;
if(l == r){
tr[p].sum[a[l]] = 1;
// cout<<a[l]<< " "<<tr[p].sum[a[l]]<<endl;
return ;
}
int mid = (l + r) >> 1;
build(ls(p), l, mid);
build(rs(p), mid+1, r);
pushup(p);
return ;
}
inline void pushdown(int p){
if(!rev(p)) return ;
rev(ls(p)) ^= 1;
rev(rs(p)) ^= 1;
rev(p) ^= 1;
swap(sum1(ls(p)), sum0(ls(p)));
swap(sum1(rs(p)), sum0(rs(p)));
return ;
}
inline void update(int p, int l, int r, int x, int y){
if(x <= l && r <= y){
rev(p) ^= 1;
swap(sum1(p), sum0(p));
return ;
}
pushdown(p);
int mid = (l + r) >> 1;
if(x <= mid) update(ls(p), l, mid, x, y);
if(y > mid) update(rs(p), mid+1, r, x, y);
pushup(p);
return ;
}
inline int query(int p, int l, int r, int x, int y){
if(x <= l && r <= y)
return sum1(p);
pushdown(p);
int mid = (l + r) >> 1;
int t1 = 0, t2 = 0;
if(x <= mid) t1 = query(ls(p), l, mid, x, y);
if(y > mid) t2 = query(rs(p), mid+1, r, x, y);
return t1 + t2;
}
int n, m;
signed main(){
// freopen("P2574.in", "r", stdin);
// freopen("ans.out", "w", stdout);
read(n), read(m);
for(int i=1; i<=n; i++){
int x = getchar();
a[i] = x - '0';
}
build(1, 1, n);
// for(int i=1; i<=n; i++)
// printf("%d ", query(1, 1, n, i, i));
// printf("\n");
for(int i=1; i<=m; i++){
int op, l, r;
read(op), read(l), read(r);
if(op) printf("%d\n", query(1, 1, n, l, r));
else update(1, 1, n, l, r);
// for(int i=1; i<=n; i++)
// printf("%d ", query(1, 1, n, i, i));
// printf("\n");
}
return 0;
}