1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
| #include <bits/stdc++.h>
#define debug(x) cerr << #x << " = " << x << endl
using namespace std; typedef long long LL;
const int MAXN = 2E5 + 5; const int MOD = 1E9 + 7; int n, q; char s[MAXN];
#define lid id << 1 #define rid id << 1 | 1
struct node { int l, r; int sum, mipre; } tr[MAXN << 2];
void update(int id) { tr[id].sum = tr[lid].sum + tr[rid].sum; tr[id].mipre = min(tr[lid].mipre, tr[lid].sum + tr[rid].mipre); }
void build(int id, int l, int r) { tr[id].l = l, tr[id].r = r; if (l == r) { tr[id].sum = tr[id].mipre = (s[l] == '(' ? 1 : -1); return; } int mid = l + r >> 1; build(lid, l, mid); build(rid, mid + 1, r); update(id); }
void modify(int id, int x, char v) { if (tr[id].l == x && tr[id].r == x) { tr[id].sum = tr[id].mipre = (v == '(' ? 1 : -1); return; } int mid = tr[id].l + tr[id].r >> 1; if (x <= mid) modify(lid, x, v); else modify(rid, x, v); update(id); }
int qsum(int id, int l, int r) { if (tr[id].l == l && tr[id].r == r) return tr[id].sum; int mid = tr[id].l + tr[id].r >> 1; if (r <= mid) return qsum(lid, l, r); else if (l > mid) return qsum(rid, l, r); else return qsum(lid, l, mid) + qsum(rid, mid + 1, r); }
int qmin(int id, int l, int r) { if (tr[id].l == l && tr[id].r == r) return tr[id].mipre; int mid = tr[id].l + tr[id].r >> 1; if (r <= mid) return qmin(lid, l, r); else if (l > mid) return qmin(rid, l, r); else return min(qmin(lid, l, mid), qsum(lid, l, mid) + qmin(rid, mid + 1, r)); }
signed main() { ios::sync_with_stdio(false); cin >> n >> q; for (int i = 1; i <= n; i++) cin >> s[i]; build(1, 1, n); for (int i = 1, t, l, r; i <= q; i++) { cin >> t >> l >> r; if (t == 1) { modify(1, l, s[r]), modify(1, r, s[l]); swap(s[l], s[r]); } else { if (qmin(1, l, r) >= 0 && qsum(1, l, r) == 0) cout << "Yes\n"; else cout << "No\n"; } } return 0; }
|