#include #include #include #include #include using namespace std; #define REP(i,n) for(int i = 0; i < (n); ++i) const int INF = 1000000000; struct MaxTree { int *el, s; MaxTree(int size) { el = new int[2 * (s = 1 << size)]; REP(x, 2*s) el[x] = 0; } ~MaxTree() { delete[] el; } void Set(int p, int v) { for(p += s, el[p] = v, p>>=1; p>0; p>>=1) el[p] = max(el[p << 1], el[(p<<1)+1]); } int Find(int p, int k) { int m = -INF; p += s; k += s; while(p>=1; k>>=1; } if(p == k) m = max(m, el[p]); return m; } }; int main() { int M, Q, B, E, K; bool first = true; while(true) { scanf("%d %d", &M, &Q); if(M == 0 && Q == 0) break; if(first) { first = false; } else { printf("\n"); } vector seq; seq.reserve(M); map mapa; int size = ceil(log(M)/log(2)+1); MaxTree tree(size); REP(i,M) { scanf("%d", &K); seq.push_back(K); map::iterator it = mapa.find(K); int lp = 0; if(it == mapa.end()) { lp = 0; } else { lp = it->second; } mapa[K] = i + 1; tree.Set(i, lp); } REP(i,Q) { scanf("%d %d", &B, &E); //--B,--E; //printf("%d %d: \n", B, E); int mx = tree.Find(B-1, E-1); if(mx >= B && mx > 0) { printf("%d\n", seq[mx-1]); } else { printf("OK\n"); } } } return 0; }