//P2574
#include<bits/stdc++.h>
#define MAXN 200005
#define ls (u<<1)
#define rs (u<<1|1)
using namespace std;
struct node
{
int l,r,sum,add;
};
node tr[MAXN<<2];
char c;
int op,n,m,x,y,a[MAXN],b[MAXN];
inline int read()
{
int f=1,k=0;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-')
f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
k=(k<<1)+(k<<3)+(c^48);
c=getchar();
}
return f*k;
}
void pushup(int u)
{
tr[u].sum=tr[ls].sum+tr[rs].sum;
}
void pushdown(int u)
{
if(tr[u].add)
{
tr[ls].add^=1;
tr[rs].add^=1;
tr[ls].sum=(tr[ls].r-tr[ls].l+1)-tr[ls].sum;
tr[rs].sum=(tr[rs].r-tr[rs].l+1)-tr[rs].sum;
tr[u].add=0;
}
}
void build(int u,int l,int r)
{
tr[u].l=l;
tr[u].r=r;
tr[u].sum=a[l];
tr[u].add=0;
if(l==r)
{
return ;
}
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
pushup(u);
return ;
}
void update(int u,int x,int y)
{
if(x<=tr[u].l&&tr[u].r<=y)
{
tr[u].add^=1;
tr[u].sum=(tr[u].r-tr[u].l+1)-tr[u].sum;
return ;
}
pushdown(u);
int mid=(tr[u].l+tr[u].r)>>1;
if(x<=mid)
{
update(ls,x,y);
}
if(y>mid)
{
update(rs,x,y);
}
pushup(u);
}
int query(int u,int x,int y)
{
if(x<=tr[u].l&&tr[u].r<=y)
{
return tr[u].sum;
}
pushdown(u);
int sum=0,mid=(tr[u].l+tr[u].r)>>1;
if(x<=mid)
{
sum+=query(ls,x,y);
}
if(y>mid)
{
sum+=query(rs,x,y);
}
return sum;
}
void debug(int u)
{
if(tr[u].l==tr[u].r)
{
b[tr[u].l]=tr[u].sum;
return ;
}
int mid=(tr[u].l+tr[u].r)>>1;
debug(ls);
debug(rs);
}
int main()
{
// freopen("P2574.in","r",stdin);
// freopen("P2574.out","w",stdout);
n=read(),m=read();
for(int i=1;i<=n;i++)
{
c=getchar();
a[i]=c-48;
b[i]=a[i];
}
build(1,1,n);
for(int i=1;i<=m;i++)
{
op=read(),x=read(),y=read();
if(op==0)
{
update(1,x,y);
//debug(1);
}
else
{
printf("%d\n",query(1,x,y));
}
}
return 0;
}
备注:
下载样例1输入:
10 5
1001010110
1 2 3
0 6 9
1 7 10
1 2 5
1 2 7
输出:
0
1
1
2