#include #include #include #include #include using namespace std; using namespace atcoder; using ll = long long; const int INF = 1000000000; //座標圧縮 //#include #include が必要 set st; map mp; vector makeCompressionVector(vector iv){ for(int i = 0; i < int(iv.size()); i++){ st.insert(iv[i]); } int cnt = 0; for(auto itr = st.begin(); itr != st.end(); ++itr){ mp[*itr] = cnt; cnt++; } for(int i = 0; i < int(iv.size()); i++){ iv[i] = mp[iv[i]]; } return iv; } int op(int a, int b) { return min(a, b); } int e() { return INF; } int main(){ int N, Q; cin >> N >> Q; vector A(N, 0); for(int i = 0; i < N; i++) cin >> A[i]; auto val = makeCompressionVector(A); int r = (int)st.size(); vector> list_idx(r); vector idxl(r, -1), idxr(r, -1); for(int i = 0; i < N; i++) list_idx[val[i]].push_back(i); segtree seg_min(r), seg_max(r); for(int i = 0; i < r; i++){ if(list_idx[i].size() > 0){ idxl[i] = 0; idxr[i] = (int)list_idx[i].size() - 1; seg_min.set(i, list_idx[i][idxl[i]]); seg_max.set(i, -list_idx[i][idxr[i]]); } } for(int q = 0; q < Q; q++){ int c, target; cin >> c >> target; target++; auto itr = st.lower_bound(target); if(itr == st.end()){ cout << -1 << endl; continue; } int l = mp[*itr]; if(c == 1){ auto ret = seg_min.prod(l, r); if(ret == INF){ cout << -1 << endl; }else{ cout << ret + 1 << endl; int l = val[ret]; idxl[l]++; if(idxl[l] > idxr[l]){ seg_min.set(l, INF); seg_max.set(l, INF); }else{ seg_min.set(l, list_idx[l][idxl[l]]); } } } if(c == 2){ auto ret = seg_max.prod(l, r); if(ret == INF){ cout << -1 << endl; }else{ cout << -ret + 1 << endl; int l = val[-ret]; idxr[l]--; if(idxl[l] > idxr[l]){ seg_min.set(l, INF); seg_max.set(l, INF); }else{ seg_max.set(l, -list_idx[l][idxr[l]]); } } } } return 0; }