#include #include using namespace std; const int MAXQ = 800005; char st[MAXQ]; int ptr_history[MAXQ]; // Sの長さ L に対する st_ptr の値を保存 int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int Q; cin >> Q; int current_S_len = 0; int st_ptr = 0; ptr_history[0] = 0; for (int i = 0; i < Q; ++i) { int type; cin >> type; if (type == 1) { char c; cin >> c; current_S_len++; // 前の状態(S_len - 1)の st_ptr を引き継いで新しい文字を処理 st_ptr = ptr_history[current_S_len - 1]; st[st_ptr] = c; st_ptr++; if (st_ptr >= 3 && st[st_ptr-3] == '(' && st[st_ptr-2] == '|' && st[st_ptr-1] == ')') { st_ptr -= 3; } ptr_history[current_S_len] = st_ptr; } else { // クエリ2: 文字列Sの長さを減らす current_S_len--; // 次回 type 1 が来た時に ptr_history[current_S_len] から再開される st_ptr = ptr_history[current_S_len]; } if (st_ptr == 0) cout << "Yes\n"; else cout << "No\n"; } return 0; }