#include #include #include #include #include #include #include #include #include #include #include #define FORE(it, c) for(__typeof((c).begin()) it = (c).begin(); it != (c).end(); ++it) #define FC(aa, bb) FORE(bb, aa) #define debug(x) cerr << #x << " = " << x << endl; #define debugv(x) cerr << #x << " = " ; FORE(it, (x)) cerr << *it << ", "; cerr << endl; #define fup(i, a, b) for(int i = (a); i <= (b); ++i) #define fdo(i, a, b) for(int i = (a); i >= (b); --i) #define FOR fup #define FORD fdo #define REP(i, n) for(int i = 0; i < (n); ++i) #define ALL(x) (x).begin(), (x).end() #define CLR(x) memset((x), 0, sizeof(x)) #define MP make_pair #define PB push_back #define siz(a) ((int)(a).size()) #define SZ siz #define inf 1000000000 #define FI first #define SE second using namespace std; typedef long long lli; typedef double ld; typedef lli LL; typedef ld LD; typedef vector VI; typedef pair PII; const int MAXN = 1000100; int tab[MAXN]; int res[MAXN]; bool solve() { map M; int n,q; if (scanf("%d%d", &n, &q) != 2) return false; if (n == 0) return false; // printf("%d %d\n", n, q); REP(i, n) { scanf("%d", &tab[i]); res[i] = inf; } int i = 0; REP(j, n) { while(i < n && siz(M) == i-j) { if (M.find(tab[i]) != M.end()) { M[tab[i]]++; } else M[tab[i]] = 1; ++i; } if (i == n) break; //printf("%d -> %d (%d %d)\n", j, res[j], i-j, siz(M)); res[j] = i-1; int ile = M[tab[j]]; if (ile == 1) M.erase(tab[j]); else M[tab[j]] = ile-1; } REP(i, q) { int a, b; scanf("%d%d", &a, &b); --a;--b; if (b < res[a]) { printf("OK\n"); } else printf("%d\n", tab[res[a]]); } printf("\n"); return true; }; int main() { while(solve()) {}; return 0; }