#include #include using namespace std; // Sử dụng mảng cố định để tiết kiệm bộ nhớ và tăng tốc độ char st[800005]; // Stack lưu các ký tự chưa bị triệt tiêu int st_ptr[800005]; // st_ptr[i] lưu độ cao của stack sau i ký tự của chuỗi S char s_history[800005]; // Lưu ký tự thứ i của chuỗi S int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int Q; cin >> Q; int s_len = 0; // Độ dài hiện tại của chuỗi S st_ptr[0] = 0; // Ban đầu chuỗi rỗng, stack cao 0 for (int i = 0; i < Q; ++i) { int type; cin >> type; if (type == 1) { char c; cin >> c; s_len++; s_history[s_len] = c; // Lấy độ cao stack hiện tại từ bước trước đó của S int top = st_ptr[s_len - 1]; // Thêm ký tự mới vào stack st[top + 1] = c; top++; // Kiểm tra triệt tiêu bộ ba (|) if (top >= 3 && st[top] == ')' && st[top-1] == '|' && st[top-2] == '(') { top -= 3; } // Lưu lại độ cao stack sau khi xử lý ký tự thứ s_len của S st_ptr[s_len] = top; } else { // Truy vấn loại 2: Xóa ký tự cuối của S if (s_len > 0) s_len--; } // Nếu độ cao stack tại thời điểm s_len là 0 thì chuỗi S là dãy tốt if (st_ptr[s_len] == 0) { cout << "Yes\n"; } else { cout << "No\n"; } } return 0; }