using namespace std; const int maxn=200000+5; char a[maxn]; int sumv[maxn*10],addv[maxn*10],rev[maxn*10]; #define lson o*2 #define rson o*2+1 #define mid l+(r-l)/2 void (int o,int l,int r) { sumv[o]=sumv[lson]+sumv[rson]; sumv[o]+=addv[o]*(r-l+1); } void getxor(int o,int l,int r) { rev[o]^=1; sumv[o]=(r-l+1)-sumv[o]; } void pushdown(int o,int l,int r) { if(rev[o]) { getxor(lson,l,mid);getxor(rson,mid+1,r); maintain(o,l,r); rev[o]=0; } } void update(int o,int l,int r,int ql,int qr) { if(ql>r || qr<l) return; if(ql<=l && r<=qr) {getxor(o,l,r);return;} else{ pushdown(o,l,r); update(lson,l,mid,ql,qr); update(rson,mid+1,r,ql,qr); maintain(o,l,r); } } int getsum(int o,int l,int r,int ql,int qr) { if(ql>r || qr<l) return 0; if(ql<=l && r<=qr) return sumv[o]; else{ pushdown(o,l,r); int res=0; res+=getsum(lson,l,mid,ql,qr); res+=getsum(rson,mid+1,r,ql,qr); return res; } } void build(int o,int l,int r) { if(l==r){ sumv[o]=a[l]-'0';return; }else{ build(lson,l,mid);build(rson,mid+1,r); maintain(o,l,r); } } int main() { int n,m; scanf("%d%d",&n,&m); scanf("%s",a+1); build(1,1,n); for(int i=0;i<m;i++) { int op,l,r; scanf("%d%d%d",&op,&l,&r); if(op==0){ update(1,1,n,l,r); }else{ printf("%dn",getsum(1,1,n,l,r)); } } return 0; }
|
近期评论