You are given a one-indexed string of brackets of length . A string of brackets is considered "balanced" if it is classified in one of the three categories listed below:
- It is an empty string.
- It has the form of
, where
is a balanced string.
- It has the form
, where
and
are both balanced strings.
For example, ()(())
is balanced, but )()(()
is not. A subsequence of a string is a string obtained by deleting some (possibly zero) characters of the string. Please note that a subsequence does not have to be contiguous. You are to write a program that supports of the following two operations:
- Output the length of the longest balanced subsequence of the substring from index
to
inclusive.
- Flip the bracket located at index
. (i.e. from
(
to)
and vice versa)
Constraints
Subtask 1 [30%]
Subtask 2 [70%]
No additional constraints.
Input Specification
The first line of input will contain two integers and
, the length of the string and the number of operations.
The second line will contain a string of length , the initial sequence of brackets. The string will only contain
(
and )
.
Each of the next lines will start with either
or
. If it starts with
, two integers
and
will follow. If it starts with
, one integer
will follow.
Output Specification
For each type operation, print one line containing the length of the longest balanced subsequence.
Sample Input
10 7
()))(())((
1 5 8
1 3 6
1 1 10
2 10
1 9 10
2 3
1 1 10
Sample Output
4
0
6
2
10
Explanation
For the first type query, the whole substring
(())
is balanced.
For the second type query, there exists no balanced subsequence with positive length.
For the third type query, the required subsequence
()(())
goes from index to
, then
to
.
For the fourth type query, the whole substring
()
is balanced after the update.
For the fifth type query, the whole string
()()(())()
is balanced after the second update.
Comments