#include<bits/stdc++.h>
using namespace std;
namespace acac
{
struct node
{
int ls,rs,sz,num,v,wz,tag,xo,rev,rmax,rmin,lmin,lmax,sum;
}tree[100010];
int cnt,rt;
void new_node(int &va,int w,int val)
{
tree[++cnt].sz=1;
va=cnt;
tree[cnt].wz=w;
tree[cnt].v=tree[cnt].sum=val;
tree[cnt].lmin=tree[cnt].rmin=min(0,val);
tree[cnt].lmax=tree[cnt].rmax=max(0,val);
tree[cnt].num=rand();
}
void pu(int u)
{
int ls=tree[u].ls,rs=tree[u].rs;
tree[u].sz=tree[ls].sz+tree[rs].sz+1;
//if(u==4)cout<<ls<<' '<<rs<<endl;
tree[u].sum=tree[ls].sum+tree[rs].sum+tree[u].v;
tree[u].lmax=max(tree[ls].lmax,tree[ls].sum+tree[u].v+tree[rs].lmax);
tree[u].lmin=min(tree[ls].lmin,tree[ls].sum+tree[u].v+tree[rs].lmin);
tree[u].rmax=max(tree[rs].rmax,tree[rs].sum+tree[u].v+tree[ls].rmax);
tree[u].rmin=min(tree[rs].rmin,tree[rs].sum+tree[u].v+tree[ls].rmin);
}
void qf(int u)
{
if(!u)return ;
tree[u].v=-tree[u].v;
tree[u].lmax=-tree[u].lmin;
tree[u].lmin=-tree[u].lmax;
tree[u].rmax=-tree[u].rmin;
tree[u].rmin=-tree[u].rmax;
tree[u].xo^=1;
}
void reverse(int u)
{
if(!u)return ;
swap(tree[u].lmax,tree[u].rmax);
swap(tree[u].lmin,tree[u].rmin);
swap(tree[u].ls,tree[u].rs);
tree[u].rev^=1;
}
void fg(int u,int tag)
{
if(!u)return ;
tree[u].v=tag;
tree[u].sum=tag*tree[u].sz;
tree[u].lmax=max(0,tree[u].sum);
tree[u].rmax=max(0,tree[u].sum);
tree[u].lmin=min(0,tree[u].sum);
tree[u].rmin=min(0,tree[u].sum);
tree[u].tag=tag;
}
void pd(int u)
{
int ls=tree[u].ls,rs=tree[u].rs;
if(tree[u].xo)
{
qf(ls),qf(rs);
tree[u].xo=0;
}
if(tree[u].tag)
{
fg(ls,tree[u].tag),fg(rs,tree[u].tag);
tree[u].tag=0;
}
if(tree[u].rev)
{
reverse(ls),reverse(rs);
tree[u].rev=0;
}
}
void print(int u)
{
if(!u)return ;
//pd(u);
print(tree[u].ls);
cout<<u<<" ls:"<<tree[u].ls<<" rs"<<tree[u].rs<<" val:"<<tree[u].v<<" sz:"<<tree[u].sz<<" tag:"<<tree[u].tag<<" xo:"<<tree[u].xo<<" rev:"<<tree[u].rev<<endl;
print(tree[u].rs);
//pu(u);
}
void sp(int u,int &l,int &r,int sum)
{
if(!u)
{
l=r=0;
return ;
}
pd(u);
// cout<<u<<' '<<tree[tree[u].ls].sz<<' '<<sum<<endl;
if(tree[tree[u].ls].sz<sum)
{
l=u;
sp(tree[u].rs,tree[u].rs,r,sum-(tree[tree[u].ls].sz+1));
}
else
{
r=u;
sp(tree[u].ls,l,tree[u].ls,sum);
}
pu(u);
return ;
}
void me(int &u,int l,int r)
{
//cout<<u<<' '<<l <<' '<<r<<' '<<tree[u].num<<' '<<tree[r].num<<endl;
pd(l);
pd(r);
if(!l||!r)
{
u=l+r;
pu(u);
return ;
}
if(tree[l].num>tree[r].num)
{
u=l;
pd(u);
me(tree[u].rs,tree[u].rs,r);
}
else
{
u=r;
pd(u);
me(tree[u].ls,l,tree[u].ls);
}
pu(u);
}
void ins(int v,int val)
{
int rt1,rt2,rt3,rt4;
sp(rt,rt1,rt2,v);
// print(rt1);
sp(rt1,rt3,rt4,v-1);
// print(rt3);
// cout<<endl;
if(!rt4)new_node(rt4,v,val);
me(rt1,rt3,rt4);
me(rt,rt1,rt2);
}
char S[100010];
int main()
{
int n,q;
scanf("%d%d",&n,&q);
scanf("%s",S+1);
for(int i=1;i<=n;i++)
{
if(S[i]=='(')ins(i,-1);
else ins(i,1);
// print(rt);
// cout<<endl;
}
//print(rt);
while(q--)
{
int a,b;
scanf("%s%d%d",S,&a,&b);
if(S[0]=='R')
{
scanf("%s",S);
int t=1,rt1,rt2,rt3,rt4;
if(S[0]=='(')t=-1;
sp(rt,rt1,rt2,a-1);
sp(rt2,rt3,rt4,b-a+1);
fg(rt3,t);
// print(rt3);
me(rt2,rt3,rt4);
me(rt,rt1,rt2);
}
else if(S[0]=='S')
{
int rt1,rt2,rt3,rt4;
sp(rt,rt1,rt2,a-1);
sp(rt2,rt3,rt4,b-a+1);
// print(rt3);
// cout<<endl;
reverse(rt3);
me(rt2,rt3,rt4);
me(rt,rt1,rt2);
}
else if(S[0]=='I')
{
int rt1,rt2,rt3,rt4;
sp(rt,rt1,rt2,a-1);
// print(rt2);
// cout<<endl;
sp(rt2,rt3,rt4,b-a+1);
qf(rt3);
// print(rt3);
// cout<<endl;
me(rt2,rt3,rt4);
me(rt,rt1,rt2);
}
else
{
int rt1,rt2,rt3,rt4;
sp(rt,rt1,rt2,a-1);
sp(rt2,rt3,rt4,b-a+1);
// cout<<tree[rt3].rmax<<endl;
cout<<(tree[rt3].lmax+1)/2+(abs(tree[rt3].rmin)+1)/2<<'\n';
me(rt2,rt3,rt4);
me(rt,rt1,rt2);
}
// print(rt);
// cout<<endl;
}
return 0;
}
}
int main()
{
// freopen("P3369_8.in","r",stdin);
// freopen("P3369.out","w",stdout);
acac::main();
return 0;
}
/*
10 20
()(((()())
S 4 7
Q 1 10
R 1 8 (
I 7 10
*/