#include int min(int a, int b) { if (a < b) return a; else return b; } int seg[800005], lazy[800005], ss; void eval(int k) { seg[k] += lazy[k]; if (k < ss - 1) { lazy[2 * k + 1] += lazy[k]; lazy[2 * k + 2] += lazy[k]; } lazy[k] = 0; return; } void update(int a, int b, int d, int k, int l, int r) { eval(k); if (a <= l && r <= b) { lazy[k] += d; eval(k); } else if (a < r && l < b) { update(a, b, d, 2 * k + 1, l, (l + r) / 2); update(a, b, d, 2 * k + 2, (l + r) / 2, r); seg[k] = min(seg[2 * k + 1], seg[2 * k + 2]); } return; } int get(int a, int b, int k, int l, int r) { eval(k); if (r <= a || b <= l) return 1e9; else if (a <= l && r <= b) return seg[k]; else { int res1, res2; res1 = get(a, b, 2 * k + 1, l, (l + r) / 2); res2 = get(a, b, 2 * k + 2, (l + r) / 2, r); return min(res1, res2); } } char s[200005]; int main() { int n, q; scanf("%d %d", &n, &q); int i; scanf("%s", s); for (ss = 1; ss <= n; ss *= 2); for (i = 0; i < 2 * ss - 1; i++) { seg[i] = 0; lazy[i] = 0; } int d; char c; for (i = 0; i < n; i++) { if (s[i] == '(') d = 1; else d = -1; update(i + 1, n + 1, d, 0, 0, ss); } int type, x, t, l, r; int left, right, ans; for (; q > 0; q--) { scanf("%d", &type); if (type == 1) { scanf("%d %d", &x, &t); x--; if (t == 1) c = '('; else c = ')'; if (s[x] != c) { s[x] = c; d = 3 - 2 * t; update(x + 1, n + 1, 2 * d, 0, 0, ss); } } else { scanf("%d %d", &l, &r); right = get(r, r + 1, 0, 0, ss); left = get(l - 1, l, 0, 0, ss); d = get(l - 1, r + 1, 0, 0, ss); ans = left + right - 2 * min(left, right); ans += 2 * (min(left, right) - d); ans = r - l + 1 - ans; printf("%d\n", ans); } } return 0; }