rt,代码如下:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5+5;
int n,m;
struct node{
int val,pmx,smx,pmn,smn,sum,sz,key,ls,rs;
int tag1,tag2,tag3;
}t[N];
int cnt;
inline int make(int v)
{
t[++cnt].sz = 1;
t[cnt].key = rand();
if(v==1) t[cnt].pmx = t[cnt].smx = 1;
else t[cnt].pmn = t[cnt].smn = -1;
t[cnt].sum = t[cnt].val = v;
return cnt;
}
inline void fan(int k)
{
if(!k) return;
t[k].val = -t[k].val,t[k].sum = -t[k].sum;
swap(t[k].pmx,t[k].pmn),swap(t[k].smx,t[k].smn);
t[k].pmx = -t[k].pmx,t[k].pmn = -t[k].pmn,t[k].smx = -t[k].smx,t[k].smn = -t[k].smn;
t[k].tag1^=1,t[k].tag2*=-1;
}
inline void cover(int k,int v)
{
if(!k) return;
t[k].sum = t[k].sz*v,t[k].val = v;
if(v==1) t[k].pmx = t[k].smx = t[k].sum,t[k].smn = t[k].pmn = 0;
else t[k].pmn = t[k].smn = t[k].sum,t[k].smx = t[k].pmx = 0;
t[k].tag2 = v;
}
inline void reverse(int k)
{
if(!k) return;
swap(t[k].smx,t[k].pmx),swap(t[k].smn,t[k].pmn),swap(t[k].ls,t[k].rs);
t[k].tag3^=1;
}
inline void down(int k)
{
if(!k) return;
if(t[k].tag1) fan(t[k].ls),fan(t[k].rs),t[k].tag1 = 0;
if(t[k].tag2) cover(t[k].ls,t[k].tag2),cover(t[k].rs,t[k].tag2),t[k].tag2 = 0;
if(t[k].tag3) reverse(t[k].ls),reverse(t[k].rs),t[k].tag3 = 0;
}
inline void pushup(int k)
{
t[k].sum = t[t[k].ls].sum+t[t[k].rs].sum+t[k].val;
t[k].sz = t[t[k].ls].sz+t[t[k].rs].sz+1;
t[k].pmn = min(t[t[k].ls].pmn,t[t[k].ls].sum+t[k].val+t[t[k].rs].pmn);
t[k].pmx = max(t[t[k].ls].pmx,t[t[k].ls].sum+t[k].val+t[t[k].rs].pmx);
t[k].smn = min(t[t[k].rs].smn,t[t[k].rs].sum+t[k].val+t[t[k].ls].smn);
t[k].smx = max(t[t[k].rs].smx,t[t[k].rs].sum+t[k].val+t[t[k].ls].smx);
}
int merge(int x,int y)
{
down(x),down(y);
if(x==0||y==0) return x+y;
if(t[x].key<t[y].key)
{
t[x].rs = merge(t[x].rs,y),pushup(t[x].rs);
return x;
}
else
{
t[y].ls = merge(x,t[y].ls),pushup(t[y].ls);
return y;
}
}
void split(int k,int v,int &x,int &y)
{
if(!k) return x = y = 0,void();
down(k);
if(t[t[k].ls].sz<v) x = k,split(t[k].rs,v-t[t[k].ls].sz-1,t[k].rs,y);
else y = k,split(t[k].ls,v,x,t[k].ls);
pushup(k);
}
string s;
int rt,x,y,z;
void dfs(int k)
{
if(!k) return;
down(k);
dfs(t[k].ls),cout<<t[k].val<<' ',dfs(t[k].rs);
}
signed main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
srand(114514);
cin>>n>>m>>s;
for(auto i:s)
rt = merge(rt,make(i==')'?1:-1));
while(m--)
{
string op;char ch;
int l,r;
cin>>op>>l>>r;
split(rt,l-1,x,y);
split(y,r-l+1,y,z);
if(op[0]=='R') cin>>ch,cover(y,(ch==')'?1:-1));
else if(op[0]=='S') reverse(y);
else if(op[0]=='I') fan(y);
else cout<<(-t[y].pmn+1)/2+(t[y].smx+1)/2<<'\n';
rt = merge(x,merge(y,z));
// dfs(rt);
// cout<<'\n';
}
return 0;
}