#pragma GCC target("avx2") #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #include using namespace std; class LinkedList { private: class Node { public: int index; int key; Node *prev; Node *next; }; Node *nil; // 番兵 Node* left_search(int key) { Node *current = nil->next; while (current != nil && current->key <= key) { current = current->next; } return current; } Node* right_search(int key) { Node *current = nil->prev; while (current != nil && current->key <= key) { current = current->prev; } return current; } int pop_node(Node *node) { if (node == nil) return -1; // nodeが番兵の時は何もしない node->prev->next = node->next; node->next->prev = node->prev; int index = node->index; delete node; return index; } public: LinkedList() { nil = new Node; nil->prev = nil; nil->next = nil; } void insert(int index, int key) { Node *x; // 新しいノードをさすポインタ x = new Node; x->index = index; x->key = key; // リンクのつなぎ替え x->prev = nil->prev; nil->prev->next = x; nil->prev = x; x->next = nil; } // 先頭を削除 int pop_first(int key) { return pop_node(left_search(key)); } // 末尾を削除 int pop_last(int key) { return pop_node(right_search(key)); } }; int main() { ios::sync_with_stdio(false); std::cin.tie(nullptr); int N, Q; cin >> N >> Q; LinkedList A; for (int i = 0; i < N; i++) { int key; cin >> key; A.insert(i + 1, key); } for (int i = 0; i < Q; i++) { int c, x; cin >> c >> x; if (c == 1) { cout << A.pop_first(x) << endl; } else { cout << A.pop_last(x) << endl; } } }