#pragma GCC optimize("Ofast") #pragma GCC optimize("unroll-loops") #include using namespace std; using ll = long long; const ll mod = 1e9 + 7; const ll mod2 = 998244353; ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; } ll pow(ll a, ll b) { ll ans = 1; while (b) { if (b & 1) ans *= a; b >>= 1; a *= a; } return ans; } ll pow(ll a, ll b, ll c) { ll ans = 1; while (b) { if (b & 1) ans = (ans * a) % c; b >>= 1; a = (a * a) % c; } return ans; } void check(bool b) { if (b) cout << "Yes\n"; else cout << "No\n"; } #include #include using namespace __gnu_pbds; #define pSet tree, null_type,less<>, rb_tree_tag,tree_order_statistics_node_update> int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); ll n;cin>>n; vectora(n); for (int i = 0; i < n; ++i) { cin>>a[i]; } ll q;cin>>q; pSet s; vector>v(n+q+1); vector>queries; ll back=n+1; vectorp(n+q+1, -1);ll pos=0; while (q--){ ll t;cin>>t; if (t==1){ ll x;cin>>x; queries.push_back({1, back}); v[x].push_back(back++); } else if (t==2){ queries.push_back({2}); } else { ll x;cin>>x;--x; queries.push_back({3, x}); } } for (int i = 1; i < n+1; ++i) { ll x=a[i-1]; vectorv1; while (x!=-1){ if (!v[x].empty()){ v1.push_back(x); auto it = v[x].front(); v[x].pop_front(); x = it; } else { p[x]=pos++; if (v1.empty()) { x = -1; } else { x = v1.back(); v1.pop_back(); } } } s.insert({p[a[i-1]], a[i-1]}); } { ll x=0; vectorv1; while (x!=-1){ if (!v[x].empty()){ v1.push_back(x); auto it = v[x].front(); v[x].pop_front(); x = it; } else { p[x]=pos++; if (v1.empty()) { x = -1; } else { x = v1.back(); v1.pop_back(); } } } } for(auto &i:queries){ if (i[0]==1){ s.insert({p[i[1]], i[1]}); } else if (i[0]==2){ s.erase(s.begin()); } else { auto it = s.find_by_order(i[1]); cout<second<<'\n'; } } return 0; }