#include #include #include #include #include using namespace std; struct Node { int match; int open; int close; }; Node merge(const Node& L, const Node& R) { int new_match = min(L.open, R.close); return { L.match + R.match + new_match, L.open + R.open - new_match, L.close + R.close - new_match }; } struct SegTree { int n; vector tree; SegTree(int len, const string& s) { n = 1; while (n < len) n *= 2; tree.assign(2 * n, {0, 0, 0}); for (int i = 0; i < len; ++i) { if (s[i] == '(') tree[n + i] = {0, 1, 0}; else tree[n + i] = {0, 0, 1}; } for (int i = n - 1; i > 0; --i) { tree[i] = merge(tree[2 * i], tree[2 * i + 1]); } } void update(int idx, char c) { idx += n; if (c == '(') tree[idx] = {0, 1, 0}; else tree[idx] = {0, 0, 1}; while (idx > 1) { idx /= 2; tree[idx] = merge(tree[2 * idx], tree[2 * idx + 1]); } } Node query(int l, int r, int node, int ql, int qr) { if (qr <= l || r <= ql) return {0, 0, 0}; if (ql <= l && r <= qr) return tree[node]; int mid = (l + r) / 2; return merge(query(l, mid, 2 * node, ql, qr), query(mid, r, 2 * node + 1, ql, qr)); } int get_match_chars(int ql, int qr) { return query(0, n, 1, ql, qr).match * 2; } }; int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int n, q; if (!(cin >> n >> q)) return 0; string s; cin >> s; SegTree st(n, s); for (int i = 0; i < q; ++i) { int type; cin >> type; if (type == 1) { int x, t; cin >> x >> t; x--; st.update(x, (t == 1 ? '(' : ')')); } else { int l, r; cin >> l >> r; l--; std::println("{}", st.get_match_chars(l, r)); } } return 0; }