#include using namespace std; template struct PersistentStack{ struct Node{ T val; int sz; Node* next; Node():sz(0),next(nullptr){} Node(T x,Node* t):val(x),sz(t->sz+1),next(t){} }; vector roots; PersistentStack(){ roots.push_back(new Node()); } void push(int t,T x){ assert(0<=t&&t<(int)roots.size()); Node* r=new Node(x,roots[t]); roots.push_back(r); } void push(T x){push(prev(),x);} void pop(int t){ assert(0<=t&&t<(int)roots.size()); assert(roots[t]->next); roots.push_back(roots[t]->next); } void pop(){pop(prev());} T top(int t){ assert(0<=t&&t<(int)roots.size()); return roots[t]->val; } T top(){return top(prev());} int prev(){return (int)roots.size()-1;} int size(int t){ assert(0<=t&&t<(int)roots.size()); return roots[t]->sz; } int size(){return size(prev());} bool empty(int t){return size(t)==0;} bool empty(){return empty(prev());} void makeroot(int t){roots.push_back(roots[t]);} }; int main(){ int q; cin>>q; vector prev; PersistentStack st; while (q--){ int t; cin>>t; if (t==1){ char c; cin>>c; prev.push_back(st.prev()); st.push(c); while (st.size()>=3){ int idx=st.prev(); char c1=st.top();st.pop(); char c2=st.top();st.pop(); char c3=st.top();st.pop(); if (c3=='('&&c2=='|'&&c1==')') continue; else{ st.makeroot(idx); break; } } } if (t==2){ int p=prev.back(); st.makeroot(p); prev.pop_back(); } if (st.empty()) cout<<"Yes\n"; else cout<<"No\n"; } }