才学FHQ,0pts求调qwq
查看原帖
才学FHQ,0pts求调qwq
788951
TLE_AK楼主2024/7/12 09:54
#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
*/
2024/7/12 09:54
加载中...