#include using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int Q; cin >> Q; // node i = one open '(' frame // val[i] = 0 : before '|' // val[i] = 1 : after '|' // pre[i] = previous frame vector pre(1, -1), val(1, 0); // node 0 is the empty stack vector hist; hist.reserve(Q + 1); hist.push_back(0); // current state (top node id), -1 means invalid int cur = 0; auto is_good = [&]() -> bool { return cur == 0; // empty stack means a complete good string }; for (int qi = 0; qi < Q; qi++) { int t; cin >> t; if (t == 1) { char c; cin >> c; if (cur == -1) { // once invalid, appending more chars keeps it invalid } else if (c == '(') { pre.push_back(cur); val.push_back(0); cur = (int)pre.size() - 1; } else if (c == '|') { if (cur != 0 && val[cur] == 0) { // replace top frame 0 -> 1 pre.push_back(pre[cur]); val.push_back(1); cur = (int)pre.size() - 1; } else { cur = -1; } } else if (c == ')') { if (cur != 0 && val[cur] == 1) { cur = pre[cur]; } else { cur = -1; } } } else { // delete last character hist.pop_back(); cur = hist.back(); } hist.push_back(cur); cout << (is_good() ? "Yes" : "No") << '\n'; } return 0; }