#include #include #include #include #define MAXN 2000000 typedef struct SETITEM { int id; int last; SETITEM() {} SETITEM(int a, int b): id(a), last(b) {} int operator < (const SETITEM& Item) const {return this->id < Item.id;} } SETITEM; int M[MAXN]; int B[MAXN]; int E[MAXN]; int IB[MAXN]; int IE[MAXN]; int IN[MAXN]; int nI; int Search(int* a, int n, int k) { int best = -1, besti = -1, b1 = 0, b2, b3 = n; while(b1 < b3) { b2 = (b1 + b3) / 2; if(a[b2] == k) { return b2; } else if(a[b2] > k) { b3 = b2; } else { if(a[b2] > best) { besti = b2; best = a[b2]; } b1 = b2 + 1; } } return besti; } int main() { while(1) { int m, q; scanf("%d%d", &m, &q); if(!(m)) { break; } for(int i = 0; i < m; i++) { scanf("%d", M + i); } for(int i = 0; i < q; i++) { scanf("%d%d", B + i, E + i); B[i]--; E[i]--; } nI = 0; std::set Set; for(int i = 0; i < m; i++) { std::set::iterator it = Set.find(SETITEM(M[i], 0)); if(it == Set.end()) { Set.insert(SETITEM(M[i], i)); } else { if((!(nI)) || (IB[nI - 1] < it->last)) { IB[nI] = it->last; IE[nI] = i; IN[nI] = M[i]; nI++; } *((int*) (&(it->last))) = i; } } /*printf("nI: %d\n", nI); for(int i = 0; i < nI; i++) { printf("%d -> %d\n", IB[i], IE[i]); }*/ for(int i = 0; i < q; i++) { int b = Search(IE, nI, E[i]); if((b == -1) || (IB[b] < B[i])) { printf("OK\n"); } else { printf("%d\n", IN[b]); } } printf("\n"); } return 0; }