/* -*- coding: utf-8 -*- * * 3167.cc: No.3167 [Cherry 7th Tune C] Cut in Queue - yukicoder */ #include #include #include #include #include using namespace std; /* constant */ const int MAX_N = 300000; const int MAX_QN = 300000; const int MAX_M = MAX_N + MAX_QN; /* typedef */ using lsti = list; using litr = lsti::iterator; using pii = pair; template struct BIT { int n; vector bits; BIT() {} BIT(int _n) { init(_n); } void init(int _n) { n = _n; bits.assign(n + 1, 0); } T sum(int x) { x = min(x, n); T s = 0; while (x > 0) { s += bits[x]; x -= (x & -x); } return s; } void add(int x, T v) { if (x <= 0) return; while (x <= n) { bits[x] += v; x += (x & -x); } } }; /* global variables */ int as[MAX_N]; pii ops[MAX_QN]; litr amp[MAX_M]; int aps[MAX_M], pas[MAX_M]; BIT bit; /* subroutines */ int findat(int m, int k) { int j0 = 0, j1 = m + 1; while (j0 + 1 < j1) { int j = (j0 + j1) / 2; if (bit.sum(j) > k) j1 = j; else j0 = j; } return j0; } void printv(int m) { for (int i = 0; i < m; i++) if (bit.sum(i + 1) > bit.sum(i)) printf(" %d", pas[i] + 1); putchar('\n');} /* main */ int main() { int n; scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d", as + i), as[i]--; int qn; scanf("%d", &qn); for (int i = 0; i < qn; i++) { int op, a = -1; scanf("%d", &op); if (op != 2) scanf("%d", &a), a--; ops[i] = {op, a}; } lsti ls; for (int i = 0; i < n; i++) amp[as[i]] = ls.insert(ls.end(), as[i]); for (int i = 0, b = n; i < qn; i++) { auto [op, a] = ops[i]; if (op == 1) { auto lit = (a >= 0) ? amp[a] : ls.end(); amp[b] = ls.insert(lit, b); b++; } } //for (auto a: ls) printf(" %d", a + 1); putchar('\n'); int m = ls.size(), p = 0; for (auto a: ls) { aps[a] = p, pas[p] = a; p++; } bit.init(m); for (int i = 0; i < n; i++) bit.add(aps[as[i]] + 1, 1); for (int i = 0, b = n; i < qn; i++) { auto [op, a] = ops[i]; //printf(" %d,%d\n", op, a + 1); if (op == 1) { int p = aps[b++]; bit.add(p + 1, 1); //printv(m); } else if (op == 2) { int j = findat(m, 0); bit.add(j + 1, -1); //printv(m); } else { int j = findat(m, a); printf("%d\n", pas[j] + 1); } } return 0; }