TLE,91pts
似乎是代码常数太大.
#include <bits/stdc++.h>
using namespace std;
const int N=3e5+2;
int n,m;
char s[6];
set<int>q;
set<int>::iterator it;
struct bit
{
unordered_map<int,int>f;
void add(int x,int y)
{
while(x<=n)
{
f[x]+=y;
x+=x&-x;
}
}
int qry(int x)
{
int res=0;
while(x)
{
res+=f[x];
x^=x&-x;
}
return res;
}
}c[N];
int main()
{
// freopen("lamp.in","r",stdin);
// freopen("lamp.out","w",stdout);
q.insert(0);
scanf("%d%d",&n,&m);
for(int i=1,x;i<=n;++i)
{
scanf("%1d",&x);
if(!x)q.insert(i);
}
q.insert(++n);
for(int i=1,x,y;i<=m;++i)
{
scanf("%s",s);
if(*s=='t')
{
scanf("%d",&x);
it=q.lower_bound(x);
int l,r,v;
if(*it!=x)r=*it,l=*(--it),v=i,q.insert(x);
else l=*(--it),++it,r=*(++it),v=-i,q.erase(x);
for(int j=l+1;j<=n;j+=j&-j)
c[j].add(x+1,v),c[j].add(r+1,-v);
for(int j=x+1;j<=n;j+=j&-j)
c[j].add(x+1,-v),c[j].add(r+1,v);
}
else
{
scanf("%d%d",&x,&y);
it=q.lower_bound(x);
int ans=(*it>=y)?i:0;
while(x)
{
ans+=c[x].qry(y);
x^=x&-x;
}
printf("%d\n",ans);
}
}
}