#include #include #include using namespace std; typedef unsigned long long ull; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int Q; cin >> Q; // ハッシュ用のランダム値を用意 mt19937_64 rng(1337); ull h_open = rng(); ull h_bar = rng(); ull h_close = rng(); vector stack; vector hash_stack; // 各時点でのハッシュ累計 hash_stack.push_back(0); // 空の状態のハッシュは 0 for (int q = 0; q < Q; ++q) { int type; cin >> type; if (type == 1) { char c; cin >> c; stack.push_back(c); // 現在の文字に応じたハッシュ値を加算 ull val = 0; if (c == '(') val = h_open; else if (c == '|') val = h_bar; else if (c == ')') val = h_close; hash_stack.push_back(hash_stack.back() ^ val); // スタックの上が (|) になったら消去 int sz = stack.size(); if (sz >= 3 && stack[sz-3] == '(' && stack[sz-2] == '|' && stack[sz-1] == ')') { for (int i = 0; i < 3; ++i) { stack.pop_back(); hash_stack.pop_back(); } } } else { // クエリ2: 末尾削除 stack.pop_back(); hash_stack.pop_back(); } // ハッシュが 0(空の状態と同じ)なら Yes if (hash_stack.back() == 0) { cout << "Yes\n"; } else { cout << "No\n"; } } return 0; }