#include using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int Q; cin >> Q; vector ch(1); // node 0 は空 vector pre(1, 0); // 前のノード vector top(Q + 1, 0); // top[len] = 長さ len の S の縮約後スタックの先頭 int len = 0; auto new_node = [&](char c, int p) { ch.push_back(c); pre.push_back(p); return (int)ch.size() - 1; }; auto can_reduce = [&](int p) { if (p == 0) return false; int a = p; int b = pre[a]; if (b == 0) return false; int c = pre[b]; if (c == 0) return false; // スタック上では末尾から見るので ')' '|' '(' の順 return ch[a] == ')' && ch[b] == '|' && ch[c] == '('; }; for (int qi = 0; qi < Q; qi++) { int t; cin >> t; if (t == 1) { char c; cin >> c; int p = top[len]; p = new_node(c, p); if (can_reduce(p)) { p = pre[pre[pre[p]]]; // 3文字 "ぐらい" pop } len++; top[len] = p; } else { len--; } cout << (top[len] == 0 ? "Yes" : "No") << '\n'; } }