维护了好多东西。。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=4*100010;
int n,m;
char s[maxn/4];
struct IntervalTree
{
int maxd[maxn],maxi[maxn],lz[maxn],rz[maxn],lin[maxn],rin[maxn],lde[maxn],rde[maxn];
int setv[maxn];
void pushdown(int o,int l,int r)
{
int lo=o*2,ro=o*2+1;
maxd[o]=max(maxd[lo],maxd[ro]);
maxi[o]=max(maxi[lo],maxi[ro]);
lz[o]=lz[lo];rz[o]=rz[ro];
lin[o]=lin[lo];rin[o]=rin[ro];
lde[o]=lde[lo];rde[o]=rde[ro];
int mid=(l+r)/2;
if(rz[lo]<=lz[ro])
{
maxi[o]=max(maxi[o],rin[lo]+lin[ro]);
if(lin[o]==mid-l+1)lin[o]+=lin[ro];
if(rin[o]==r-mid)rin[o]+=rin[lo];
}
if(rz[lo]>=lz[ro])
{
maxd[o]=max(maxd[o],rde[lo]+lde[ro]);
if(lde[o]==mid-l+1)lde[o]+=lde[ro];
if(rde[o]==r-mid)rde[o]+=rde[lo];
}
}
void build(int o,int l,int r)
{
setv[o]=0;
if(l==r)
{
maxd[o]=maxi[o]=lin[o]=rin[o]=lde[o]=rde[o]=1;
lz[o]=rz[o]=s[r-1]-'0';
return;
}
int mid=(l+r)/2;
build(o*2,l,mid);
build(o*2+1,mid+1,r);
pushdown(o,l,r);
}
void maintain(int o,int l,int r)
{
setv[o]++;
swap(maxd[o],maxi[o]);
swap(lin[o],lde[o]);
swap(rin[o],rde[o]);
lz[o]=9-lz[o];
rz[o]=9-rz[o];
}
void update(int o,int l,int r,int q1,int q2)
{
if(q1<=l&&r<=q2)
{
maintain(o,l,r);
return;
}
int mid=(l+r)/2;
if(setv[o]&1)
{
maintain(o*2,l,mid);
maintain(o*2+1,mid+1,r);
setv[o]=0;
}
if(q1<=mid)update(o*2,l,mid,q1,q2);
if(q2>mid)update(o*2+1,mid+1,r,q1,q2);
pushdown(o,l,r);
}
}tree;
int main()
{
//freopen("in.txt","r",stdin);
int t,x,y;
char qu[30];
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
scanf("%s",s);
tree.build(1,1,n);
while(m--)
{
scanf("%s",qu);
if(qu[0]=='f')
{
scanf("%d%d",&x,&y);
tree.update(1,1,n,x,y);
}
else printf("%d\n",tree.maxi[1]);
}
printf("\n");
}
return 0;
}