#CF1149C. 树生成器™

树生成器™

C. 树生成器™
时间限制:每个测试点 22
内存限制:256256 兆字节

Owl Pacino 一直很喜欢树——尤其是无根无权的有根树。他喜欢计算他看到的每一棵树的直径,即树中任意简单路径的最大长度。

Owl Pacino 的猫头鹰朋友们决定送他一个树生成器™——一个能够根据描述生成有根树的强大机器。一个 nn 个顶点的有根树可以用一个长度为 2(n1)2(n-1) 的括号序列来描述,描述方式如下:找到一条从根出发并回到根的路径,该路径每条边恰好遍历两次——一次向下,一次向上。然后沿着路径,如果沿着边向下走,就写下 "("(左括号),否则写下 ")"(右括号)。

下图展示了一些有根树及其描述:

Owl 写下了一棵 nn 个顶点的树的描述。然后他重写了 qq 次该描述。但每次重写时,他会在上一次写下的描述中选取两个不同的字符,交换它们,并写下得到的新字符串。他始终保证每次写下的字符串都是一棵有根树的描述。

然后 Pacino 为他写下的每个描述使用树生成器™。问:每个生成的树的直径是多少?


输入格式
第一行包含两个整数 n,qn, q3n1053 \le n \le 10^51q1051 \le q \le 10^5)——树的顶点数和描述修改次数。
接下来一行包含初始树的描述——一个长度为 2(n1)2(n-1) 的字符串,由左括号和右括号组成。
接下来的 qq 行,每行包含两个空格分隔的整数 ai,bia_i, b_i2ai,bi2n32 \le a_i, b_i \le 2n-3),表示要交换的两个括号的索引。你可以假定每次查询后描述会发生变化,并且每次变化后仍能根据该描述构建出一棵树。


输出格式
输出 q+1q+1 个整数——按描述被写下的顺序,每个构建出的树的直径。


样例输入 1

5 5
(((())))
4 5
3 4
5 6
3 6
2 5

样例输出 1

4
3
3
2
4
4

样例输入 2

6 4
(((())()))
6 7
5 4
6 4
7 4

样例输出 2

4
4
4
5
3

样例 1 说明