rt.
求巨佬找错或者给一组 hack/bx
#include<bits/stdc++.h>
//#define int long long
#define ll long long
#define ull unsigned long long
#define PII pair<int,int>
#define INF 0x3f3f3f3f
#define INFLL 0x3f3f3f3f3f3f3f3f
#define rep(k,l,r) for(int k=l;k<=r;++k)
#define per(k,r,l) for(int k=r;k>=l;--k)
#define cl(f,x) memset(f,x,sizeof(f))
using namespace std;
const int N=1e5+5;
mt19937 rd(time(0));
struct node {
int lson,rson;
int premax,premin,sufmax,sufmin;
int val,sum,x,siz;
int tag_cov,tag_rev,tag_inv;
}; node tree[N];
#define ls(k) tree[k].lson
#define rs(k) tree[k].rson
int p;
int new_node(int x) {
tree[++p]={0,0,max(x,0),min(x,0),max(x,0),min(x,0),x,x,(int)rd(),1,0,0,0};
return p;
}
void push_up(int k) {
tree[k].premax=max(tree[ls(k)].premax,tree[ls(k)].sum+tree[k].val+tree[rs(k)].premax);
tree[k].premin=min(tree[ls(k)].premin,tree[ls(k)].sum+tree[k].val+tree[rs(k)].premin);
tree[k].sufmax=max(tree[rs(k)].sufmax,tree[rs(k)].sum+tree[k].val+tree[ls(k)].sufmax);
tree[k].sufmin=min(tree[rs(k)].sufmin,tree[rs(k)].sum+tree[k].val+tree[ls(k)].sufmin);
tree[k].sum=tree[ls(k)].sum+tree[k].val+tree[rs(k)].sum;
tree[k].siz=tree[ls(k)].siz+1+tree[rs(k)].siz;
}
void upd_cov(int k,int val) {
tree[k].sum=tree[k].siz*val; tree[k].val=val;
tree[k].premax=tree[k].sufmax=max(0,tree[k].sum);
tree[k].premin=tree[k].sufmin=min(0,tree[k].sum);
tree[k].tag_cov=val;
}
void upd_rev(int k) {
swap(tree[k].premax,tree[k].sufmax);
swap(tree[k].premin,tree[k].premax);
tree[k].tag_rev^=1;
}
void upd_inv(int k) {
int t1=tree[k].premax,t2=tree[k].premin;
tree[k].premax=-t2; tree[k].premin=-t1;
int t3=tree[k].sufmax,t4=tree[k].sufmin;
tree[k].sufmax=-t4; tree[k].sufmin=-t3;
tree[k].tag_inv^=1;
tree[k].tag_cov=-tree[k].tag_cov;
tree[k].sum=-tree[k].sum; tree[k].val=-tree[k].val;
}
void push_down(int k) {
if(tree[k].tag_inv) {
if(ls(k))
upd_inv(ls(k));
if(rs(k))
upd_inv(rs(k));
tree[k].tag_inv=0;
}
if(tree[k].tag_cov) {
if(ls(k))
upd_cov(ls(k),tree[k].tag_cov);
if(rs(k))
upd_cov(rs(k),tree[k].tag_cov);
tree[k].tag_cov=0;
}
if(tree[k].tag_rev) {
if(ls(k))
upd_rev(ls(k));
if(rs(k))
upd_rev(rs(k));
tree[k].tag_rev=0;
}
}
int merge(int u,int v) {
if(!u||!v)
return u|v;
if(tree[u].x<tree[v].x) {
push_down(u);
rs(u)=merge(rs(u),v);
push_up(u);
return u;
} else {
push_down(v);
ls(v)=merge(u,ls(v));
push_up(v);
return v;
}
}
void split(int k,int val,int &u,int &v) {
if(!k) {
u=v=0;
return;
}
push_down(k);
if(tree[ls(k)].siz<val)
u=k,split(rs(k),val-tree[ls(k)].siz-1,rs(u),v);
else
v=k,split(ls(k),val,u,ls(v));
push_up(k);
}
int calc(char ch) {
return ch=='('? 1:-1;
}
string s;
int build(int l,int r) {
if(l==r)
return new_node(calc(s[l-1]));
int mid=(l+r)>>1;
return merge(build(l,mid),build(mid+1,r));
}
int root,n,q;
signed main() {
scanf("%d%d",&n,&q);
cin>>s;
root=build(1,n);
while(q--) {
cin>>s;
int l,r;
scanf("%d%d",&l,&r);
if(s[0]=='R') {
char ch; cin>>ch;
int u=0,v=0,w=0;
split(root,l-1,u,v);
split(v,r-l+1,v,w);
upd_cov(v,calc(ch));
root=merge(u,merge(v,w));
} else if(s[0]=='S') {
int u=0,v=0,w=0;
split(root,l-1,u,v);
split(v,r-l+1,v,w);
upd_rev(v);
root=merge(u,merge(v,w));
} else if(s[0]=='I') {
int u=0,v=0,w=0;
split(root,l-1,u,v);
split(v,r-l+1,v,w);
upd_inv(v);
root=merge(u,merge(v,w));
} else {
int u=0,v=0,w=0;
split(root,l-1,u,v);
split(v,r-l+1,v,w);
printf("%d\n",(-tree[v].premin)/2+(tree[v].sufmax)/2);
root=merge(u,merge(v,w));
}
}
return 0;
}