题号:NC54760
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld
题目描述
Bob有一个长度为 n 的括号序列 S( 仅含有 '(' 和 ')'),有一天他对该序列作出m次如下操作:
1. c l r 将下标为l,r的括号取反,即 '(' 转换成 ')' ,')' 转换成 '(' ,并回答当前
**S是否完全匹配**. 2. q l r 回答
**区间[l,r]的括号序列是否完全匹配**. 3. t l r 将下标为 l 和 r 的括号进行交换,并回答当前
**S是否完全匹配**. 定义一个括号序列 S 是完全匹配的当且仅当:
1. S 为空 ;
2. 或存在完全匹配的括号序列A,B,且S = AB
3.或存在完全匹配的括号序列 S' ,且 S = ( S' )
注意上述定义其实合法括号序列的递归定义,若不理解可以无视,完全匹配的定义是只要当前询问的括号
**合法**即可,即不存在不能匹配的左括号与右括号。
但这个问题实在是太难了,Bob无法解决,所以他把这个问题转交给你。

,

,
输入描述:
第一行两个整数,表示n和m
第二行输入长度为 n (保证n为偶数)的字符串 S
接下来m次询问, x l r ,x 表示进行操作的类型,l r 表示区间下标(x
{ 'c','q','t' } )
输出描述:
若当前所需询问的括号序列合法,则输出"YES",反之输出"NO"(输出时不带引号).
示例1
输入
复制
4 3
())(
c 3 4
t 3 4
q 1 2
备注:
注意上述操作下标都是从1开始.