#include using namespace std; const int LIM = 750; vector> aa; vector> ss; int b; int top = 0; // check function: 分割を管理する void check(int g) { if ((int)aa[g].size() < LIM) return; int m = LIM / 2; aa.insert(aa.begin() + g + 1, vector()); ss.insert(ss.begin() + g + 1, set()); for (int i = 0; i < m; ++i) { int a = aa[g].back(); aa[g].pop_back(); ss[g].erase(a); aa[g + 1].push_back(a); ss[g + 1].insert(a); } reverse(aa[g + 1].begin(), aa[g + 1].end()); } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; aa.emplace_back(); ss.emplace_back(); for (int i = 0; i < n; ++i) { int a; cin >> a; if ((int)aa.back().size() == LIM - 1) { aa.emplace_back(); ss.emplace_back(); } aa.back().push_back(a); ss.back().insert(a); } b = n + 1; int q; cin >> q; while (q--) { int t; cin >> t; if (t == 1) { int a; cin >> a; int g, i; if (a != 0) { g = 0; while (!ss[g].count(a)) ++g; auto it = find(aa[g].begin(), aa[g].end(), a); i = distance(aa[g].begin(), it); } else { g = (int)aa.size() - 1; i = (int)aa[g].size(); } aa[g].insert(aa[g].begin() + i, b); ss[g].insert(b); ++b; check(g); } else if (t == 2) { ++top; } else if (t == 3) { int k; cin >> k; k = k - 1 + top; int g = 0; while ((int)aa[g].size() <= k) { k -= aa[g].size(); ++g; } cout << aa[g][k] << '\n'; } } return 0; }