#include<bits/stdc++.h>
#define int long long
#define ls(x) (ch[x][0])
#define rs(x) (ch[x][1])
#define Debug(...) fprintf(stderr, __VA_ARGS__)
#define For(i,a,b) for(int i=a,i##end=b;i<=i##end;i++)
#define Rof(i,a,b) for(int i=a,i##end=b;i>=i##end;i--)
#define rep(i, b) for(int i=1,i##end=b;i<=i##end;i++)
using namespace std;
const int N=3e5+5,base=999983,Mod=998244353;
const double alpha=0.29;
inline void chmx(int &x,int y){(x<y)&&(x=y);}
inline void chmn(int &x,int y){(x>y)&&(x=y);}
inline void Add(int &x,int y){(x=x+y+Mod)%=Mod;}
inline int read(){
int f=0,x=0;
char ch=getchar();
while(!isdigit(ch)){f|=(ch=='-');ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return f?-x:x;
}
void print(int n){
if(n<0){
putchar('-');
n*=-1;
}
if(n>9) print(n/10);
putchar(n%10+'0');
}
int n,m;
int a[N],mi[N];int rt;
struct WBLT{
int tr[N],cnt,ch[N][2];
int lj[N],pops,siz[N];
int lzrev[N],rev[N],cov[N];
int px[N],pn[N],sx[N],sn[N];
inline int getnode(int k){
int p=(pops>0?lj[pops--]:++cnt);
siz[p]=1;ch[p][0]=ch[p][1]=0;
tr[p]=k;px[p]=sx[p]=pn[p]=sn[p]=0;
lzrev[p]=rev[p]=cov[p]=0;
if(k==1) px[p]=sx[p]=1;
else pn[p]=sn[p]=-1;
return p;
}
inline void pushup(int x){
siz[x]=siz[ls(x)]+siz[rs(x)];
tr[x]=(tr[ls(x)]+tr[rs(x)]);
px[x]=max(px[ls(x)],tr[ls(x)]+px[rs(x)]);
pn[x]=min(pn[ls(x)],tr[ls(x)]+pn[rs(x)]);
sx[x]=max(sx[rs(x)],tr[rs(x)]+sx[ls(x)]);
sn[x]=min(sn[rs(x)],tr[rs(x)]+sn[ls(x)]);
}inline void rotate(int x,int d){
swap(ls(x),rs(x));
swap(ls(ch[x][d^1]),rs(ch[x][d^1]));
swap(ch[ch[x][d^1]][d^1],ch[x][d]);
pushup(ch[x][d^1]);pushup(x);
}inline void downcov(int x,int k){
if(!x)return;
tr[x]=siz[x]*k;
if(k==1) px[x]=sx[x]=tr[x],pn[x]=sn[x]=0;
else pn[x]=sn[x]=tr[x],px[x]=sx[x]=0;
cov[x]=k;
}inline void downrev(int x){
if(!x)return;
swap(ls(x),rs(x));
swap(px[x],sx[x]);
swap(pn[x],sn[x]);
rev[x]^=1;
}inline void downr(int x){
if(!x)return;tr[x]=-tr[x];
swap(px[x],pn[x]);px[x]=-px[x],pn[x]=-pn[x];
swap(sx[x],sn[x]);sx[x]=-sx[x],sn[x]=-sn[x];
lzrev[x]^=1;cov[x]=-cov[x];
}
inline void pushdown(int x){
if(lzrev[x]){
downr(ls(x));
downr(rs(x));
lzrev[x]=0;
}if(cov[x]){
downcov(ls(x),cov[x]);
downcov(rs(x),cov[x]);
cov[x]=0;
}
if(rev[x]){
downrev(ls(x));
downrev(rs(x));
rev[x]=0;
}
}
inline void maintain(int x){
pushdown(x);
if(siz[x]==1) return;
if(min(siz[ls(x)],siz[rs(x)])>=alpha*siz[x]) return;
int d=(siz[ls(x)]<alpha*siz[x]);
pushdown(ch[x][d]);
if(siz[ch[ch[x][d]][d^1]]*(1-alpha)>=siz[ch[x][d]]*(1-2*alpha))rotate(ch[x][d],d^1);
rotate(x,d);
}void ins(int x,int k,int p){
if(siz[x]==1){
ls(x)=getnode(tr[x]),rs(x)=getnode(p);
pushup(x);
return;
}if(siz[ls(x)]>=k) ins(ls(x),k,p);
else ins(rs(x),k-siz[ls(x)],p);
pushup(x);maintain(x);
}void del(int &x,int k){
if(tr[ls(x)]>=k){
if(siz[ls(x)]==1){
lj[++pops]=x;
lj[++pops]=ls(x);x=rs(x);
}else del(ls(x),k),pushup(x),maintain(x);
}else{
if(siz[rs(x)]==1){
lj[++pops]=x;
lj[++pops]=rs(x);x=ls(x);
}else del(rs(x),k),pushup(x),maintain(x);
}
}int merge(int x,int y){
if(!x||!y) return x|y;
int k=siz[x]+siz[y];
if(min(siz[x],siz[y])>=alpha*k){
int p=getnode(0);
ls(p)=x,rs(p)=y;pushup(p);
return p;
}if(siz[x]>=siz[y]){
pushdown(x);
if(siz[ls(x)]>=alpha*k){
rs(x)=merge(rs(x),y);
pushup(x);
return x;
}ls(x)=merge(ls(x),ls(rs(x)));
pushdown(rs(x));
int p=rs(x);
rs(x)=merge(rs(rs(x)),y);
lj[++pops]=p;pushup(x);
return x;
}else{
pushdown(y);
if(siz[rs(y)]>=alpha*k){
ls(y)=merge(x,ls(y));
pushup(y);
return y;
}rs(y)=merge(rs(ls(y)),rs(y));
int p=ls(y);pushdown(ls(y));
ls(y)=merge(x,ls(ls(y)));
lj[++pops]=p;pushup(y);
return y;
}
}void split(int x,int k,int &l,int &r){
if(!k) return (void)(l=0,r=x);
pushdown(x);
if(siz[x]==1){
l=x,r=0;
return;
}if(k>=siz[ls(x)]){
split(rs(x),k-siz[ls(x)],l,r);
l=merge(ls(x),l);lj[++pops]=x;
}else{
split(ls(x),k,l,r);
r=merge(r,rs(x));lj[++pops]=x;
}
}
inline int num(int k){
int x=rt;
while(1){
if(siz[x]==1) return k==1?tr[x]:-1;
else if(siz[ls(x)]>=k) x=ls(x);
else k-=siz[ls(x)],x=rs(x);
}
}
}t;char s[N];
signed main(){
int n=read();
int Q=read();
scanf("%s",s+1);rt=t.getnode(0);
For(i,1,n) t.ins(rt,i,(s[i]=='('?-1:1));
while(Q--){
string s;cin>>s;
if(s=="Replace"){
int l=read(),r=read();char x;cin>>x;
int t1,t2,t3,t4;t.split(rt,l,t1,t2);t.split(t2,r-l+1,t3,t4);
t.downcov(t3,(x=='('?-1:1));
rt=t.merge(t1,t.merge(t3,t4));
}else if(s=="Swap"){
int l=read(),r=read();
int t1,t2,t3,t4;t.split(rt,l,t1,t2);t.split(t2,r-l+1,t3,t4);
t.downrev(t3);
rt=t.merge(t1,t.merge(t3,t4));
}else if(s=="Invert"){
int l=read(),r=read();
int t1,t2,t3,t4;t.split(rt,l,t1,t2);t.split(t2,r-l+1,t3,t4);
t.downr(t3);
rt=t.merge(t1,t.merge(t3,t4));
}else{
int l=read(),r=read();
int t1,t2,t3,t4;t.split(rt,l,t1,t2);t.split(t2,r-l+1,t3,t4);
printf("%lld\n",(abs(t.pn[t3])+1)/2+(abs(t.sx[t3])+1)/2);
rt=t.merge(t1,t.merge(t3,t4));
}
}
#ifdef LOCAL
Debug("\nMy Time: %.3lfms\n", (double)clock() / CLOCKS_PER_SEC);
#endif
return 0;
}