爆零,但是样例过了
#include <bits/stdc++.h>
using namespace std;
#define lson t[i].ch[0]
#define rson t[i].ch[1]
const int maxn=1e5+10;
int n,q;
char s[maxn];
int a[maxn];
struct fhq_treap
{
int ch[2];
int pri;
int sz;
int sum;
int sufmx,premx,sufmin,premin;
int lazycov,lazyrev,lazyinv;
}t[maxn];
int cnt,root;
int newnode(int x)
{
t[++cnt].pri=rand();
t[cnt].sz=1;
t[cnt].sum=x;
if(x==1) t[cnt].premx=t[cnt].sufmx=1;
else t[cnt].premin=t[cnt].sufmin=-1;
return cnt;
}
void update(int i)
{
t[i].sz=t[lson].sz+t[rson].sz+1;
t[i].sum=t[lson].sum+t[rson].sum+a[i];
t[i].premx=max(t[lson].premx,t[lson].sum+a[i]+t[rson].premx);
t[i].premin=min(t[lson].premin,t[lson].sum+a[i]+t[rson].premin);
t[i].sufmx=max(t[rson].sufmx,t[rson].sum+a[i]+t[lson].sufmx);
t[i].sufmin=min(t[rson].sufmin,t[rson].sum+a[i]+t[lson].sufmin);
}
void reverse(int i)
{
if(!i) return ;
swap(lson,rson);
swap(t[i].premx,t[i].sufmx);
swap(t[i].premin,t[i].sufmin);
t[i].lazyrev^=1;
}
void invert(int i)
{
if(!i) return ;
a[i]=-a[i],t[i].sum=-t[i].sum;
swap(t[i].premx,t[i].premin);
t[i].premx=-t[i].premx,t[i].premin=-t[i].premin;
swap(t[i].sufmx,t[i].sufmin);
t[i].sufmx=-t[i].sufmx,t[i].sufmin=-t[i].sufmin;
t[i].lazyinv^=1,t[i].lazycov=-t[i].lazycov;
}
void cover(int i,int d)
{
if(!i) return ;
a[i]=t[i].lazycov=d;
t[i].sum=t[i].sz*d;
if(d==1)
{
t[i].premin=t[i].sufmin=0;
t[i].premx=t[i].sufmx=t[i].sum;
return ;
}
t[i].premx=t[i].sufmx=0;
t[i].premin=t[i].sufmin=t[i].sum;
}
void pushdown(int i)
{
if(t[i].lazyinv)
{
invert(lson),invert(rson);
t[i].lazyinv=0;
return ;
}
if(t[i].lazycov)
{
cover(lson,t[i].lazycov),cover(rson,t[i].lazycov);
t[i].lazycov=0;
return ;
}
if(t[i].lazyrev)
{
reverse(lson),reverse(rson);
t[i].lazyrev=0;
return ;
}
}
int merge(int x,int y)
{
pushdown(x),pushdown(y);
if(!x||!y) return x+y;
if(t[x].pri<t[y].pri)
{
t[x].ch[1]=merge(t[x].ch[1],y);
update(x);
return x;
}
else
{
t[y].ch[0]=merge(x,t[y].ch[0]);
update(y);
return y;
}
}
void split(int i,int k,int &x,int &y)
{
if(i==0)
{
x=0,y=0;
return ;
}
pushdown(i);
if(t[lson].sz<k)
{
x=i;
split(rson,k-t[lson].sz-1,rson,y);
}
else
{
y=i;
split(lson,k,x,lson);
}
update(i);
}
void debug()
{
for(int i=1;i<=n;i++) cout<<lson<<" "<<rson<<endl;
cout<<endl;
}
void opreverse(int l,int r)
{
int x,y,z;
split(root,l-1,x,y);
split(y,r-l+1,y,z);
reverse(y);
root=merge(x,merge(y,z));
}
void opreplace(int l,int r,int d)
{
int x,y,z;
split(root,l-1,x,y);
split(y,r-l+1,y,z);
cover(y,d);
root=merge(x,merge(y,z));
}
void opinvert(int l,int r)
{
int x,y,z;
split(root,l-1,x,y);
split(y,r-l+1,y,z);
invert(y);
root=merge(x,merge(y,z));
}
int query(int l,int r)
{
int x,y,z,tmp,ans=0;
split(root,l-1,x,y);
split(y,r-l+1,y,z);
// cout<<y<<" : "<<endl;
update(y);
// debug();
tmp=t[y].premx;
// cout<<tmp<<endl;
if(tmp%2==1) tmp=tmp/2+1;
else tmp=tmp/2;
ans+=tmp;
tmp=abs(t[y].sufmin);
// cout<<tmp<<endl;
if(tmp%2==1) tmp=tmp/2+1;
else tmp=tmp/2;
ans+=tmp;
root=merge(x,merge(y,z));
return ans;
}
int main()
{
srand(time(0));
ios::sync_with_stdio(false);
cin>>n>>q>>s+1;
for(int i=1;i<=n;i++)
{
if(s[i]=='(') a[i]=-1;
else a[i]=1;
}
for(int i=1;i<=n;i++) root=merge(root,newnode(a[i]));
char op[20];
int x,y;
char d;
while(q--)
{
cin>>op+1;
if(op[1]=='R')
{
cin>>x>>y>>d;
opreplace(x,y,d=='('?-1:1);
}
if(op[1]=='S')
{
cin>>x>>y;
opreverse(x,y);
}
if(op[1]=='I')
{
cin>>x>>y;
opinvert(x,y);
}
if(op[1]=='Q')
{
cin>>x>>y;
cout<<query(x,y)<<endl;
}
}
return 0;
}
/*
5 100
(((((
Replace 1 2 )
Replace 1 3 (
Query 1 4
Replace 1 1 )
Query 1 4
*/