吾好梦中做题
题号:NC15741
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 32 M,其他语言64 M
64bit IO Format: %lld

题目描述

SK同学最喜欢做梦了,因为梦里什么都有,甚至会有题目!

有一天,SK还真梦到了一个棘手的问题。

问题是这样的,在梦里出现了一个很长很长的只包含‘(’和‘)’的括号序列。按照梦里的指引,SK需要完成一些任务。任务分为两种:一是将某个给定位置的括号方向翻转一下,即原本是左括号则变为右括号,原本是右括号则变为左括号;二是询问以某个给定的位置为左端点的区间中最长的合法括号序列的长度。

合法括号序列是这样递归定义的:

1.()是合法括号序列;

2.如果A是合法的,那么(A)也是合法的;

3.如果A和B都合法,那么AB合法。

 

机智的SK在梦里瞬间解决了这些任务,但是他醒后却想不起来自己是如何做到的,于是请你来帮他回忆做法。

输入描述:

第一行是一个正整数T(≤ 10),表示测试数据的组数,
对于每组测试数据,
第一行是两个正整数n(≤ 500000)和m(≤ 500000),分别表示括号序列的长度以及任务个数,
第二行,一个只包含左右括号的字符串,表示初始的括号序列,
接下来m行,每行包含两个正整数x,y(1 ≤ x ≤ 2,1 ≤ y ≤ n),分别表示任务种类以及给定的位置,
保证所有测试数据的括号序列长度之和与任务数之和均不超过500000。

输出描述:

对于每个任务二,输出一行,包含一个整数,表示以给定的位置为左端点的区间中最长的合法括号序列的长度,如果找不到合法括号序列则输出0。
示例1

输入

复制
1
7 5
()()())
2 2
2 1
1 2
2 3
2 1

输出

复制
0
6
4
0

说明

对于第一个任务,以第二个括号为左端点的区间构成的序列有)、)(、)()、)()(、)()()和)()()),其中没有合法的括号序列,
对于第二个任务,以第一个括号为左端点的区间构成的序列有(、()、()(、()()、()()(、()()()和()()()),其中合法的括号序列为()、()()和()()(),长度最大值是6,
对于第三个任务,序列变为((()()),
对于第三个任务,以第三个括号为左端点的区间构成的序列有(、()、()(、()()和()()),其中合法的括号序列为()和()(),长度最大值是4,
对于第四个任务,以第一个括号为左端点的区间构成的序列有(、((、(((、((()、((()(、((()()和((()()),其中没有合法的括号序列。