## https://yukicoder.me/problems/no/573 class BinaryIndexTree: """ フェニック木(BinaryIndexTree)の基本的な機能を実装したクラス """ def __init__(self, size): self.size = size self.array = [0] * (size + 1) def add(self, x, a): index = x while index <= self.size: self.array[index] += a index += index & (-index) def sum(self, x): index = x ans = 0 while index > 0: ans += self.array[index] index -= index & (-index) return ans def least_upper_bound(self, value): if self.sum(self.size) < value: return -1 elif value <= 0: return 0 m = 1 while m < self.size: m *= 2 k = 0 k_sum = 0 while m > 0: k0 = k + m if k0 < self.size: if k_sum + self.array[k0] < value: k_sum += self.array[k0] k += m m //= 2 if k < self.size: return k + 1 else: return -1 def main(): N = int(input()) A = list(map(int, input().split())) Q = int(input()) queries = [] for _ in range(Q): values = tuple(map(int, input().split())) queries.append(values) # 連結リストを作る a_map = {} prev = None for a in A: node = { "value": a, "prev": None, "next": None } a_map[a] = node if prev is not None: prev["next"] = node node["prev"] = prev prev = node tail = prev k = 1 for values in queries: if values[0] == 1: _, a = values b = N + k node = { "value": b, "prev": None, "next": None } a_map[b] = node if a == 0: tail["next"] = node node["prev"] = tail tail = node else: next_node = a_map[a] prev_node = next_node["prev"] node["next"] = next_node next_node["prev"] = node if prev_node is not None: prev_node["next"] = node node["prev"] = prev_node k += 1 # headを探す head_node = None for node in a_map.values(): if node["prev"] is None: head_node = node break node = head_node array = [] position_map = {} while node is not None: position_map[node["value"]] = len(array) array.append(node["value"]) node = node["next"] # bit bit = BinaryIndexTree(N + k + 1) for i in range(1, N + 1): bit.add(position_map[i] + 1, 1) k = N + 1 for values in queries: if values[0] == 1: _, a = values x = position_map[k] bit.add(x + 1, 1) k += 1 elif values[0] == 2: y = bit.least_upper_bound(1) bit.add(y, -1) elif values[0] == 3: _, l = values z = bit.least_upper_bound(l) print(array[z - 1]) if __name__ == '__main__': main()