看来是某个sb错误,但我看不出来啊啊啊啊。马蜂凑活看吧
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int N = 2e5 + 10;
struct node{
int val,rank;
}a[N];
int data,cnt;
int n,m;
string s;
#define val(i) a[i].val
#define tag(i) tag[i]
#define rank(i) a[i].rank
int L[N],R[N],sum[N],tag[N];
void push(int i) {
if(val(i) == 1)val(i) = 0;
else val(i) = 1;
int k = val(i) xor (tag[rank(i)]&1);
if(k == 1)sum[rank(i)]++;
else sum[rank(i)]--;
}
int find(int i) {
int k = val(i) xor (tag[rank(i)]&1);
return k;
}
void change(int l,int r) {
for(int i = l; i <= R[rank(l)]; i++)push(i);
if(rank(l) != rank(r))
for(int i = r; i >= L[rank(r)]; i--)push(i);
for(int i = rank(l)+1; i <= rank(r)-1; i++) {
sum[i] = abs(sum[i] - data);
tag[i] = tag[i]^1;
}
}
int qsum(int l,int r) {
int ans = 0;
for(int i = l; i <= R[rank(l)]; i++)
ans += find(i);
if(rank(l) != rank(r))
for(int i = r; i >= L[rank(r)]; i--)
ans += find(i);
for(int i = rank(l)+1; i <= rank(r)-1; i++)
ans += sum[i];
return ans;
}
void test() {
cout << "-----------------------" << "\n";
printf("\tid\tnum\trank\t\n");
for(int i = 1;i <= n;i++)
printf("\t%d:\t%d\t%d\n",i,val(i) xor tag(rank(i)),rank(i));
printf("\tid\tsum\ttag\n");
for(int i = 1; i <= cnt; i++)
printf("\t%d:\t%d\t%d\n",i,sum[i],tag[i]);
cout <<"\n"<< "-----------------------" << "\n";
}
void inii() {
cin >> n >> m >> s;
data = sqrt(n),cnt = n/data+1;
if(n % data == 0)cnt--;
for(int i = 0; i < n; i++) {
int j = i+1;
rank(j) = (j-1)/data+1;
if(s[i] == '1') {
val(j) = 1;
sum[rank(j)]++;
}
}
L[1] = 1; R[1] = L[1] + data -1;
for(int i = 2; i <= cnt; i++) {
L[i] = R[i-1]+1;
R[i] = min(L[i]+data-1,n);
}
}
void work() {
while(m--) {
int l,r,op;
scanf("%d",&op);
scanf("%d%d",&l,&r);
if(op == 0)change(l,r);
else cout << qsum(l,r) << "\n";
//test();
}
}
int main() {
inii();
/* for(int i = 1; i <= cnt; i++) {
cout << L[i] << " " << R[i] << " " ;
}
cout << endl;*/
work();
return 0;
}