#include #include #include #include using namespace std; pair get(int begin, int end, int st, int ee, int x, vector >&data) { if (ee <= begin) return make_pair(100000000, -1); if (st >= end) return make_pair(100000000, -1); if (st >= begin && ee <= end) return data[x]; return min(get(begin, end, st, (st+ee)/2, 2*x, data), get(begin, end, (st+ee)/2, ee, 2*x+1, data)); } void ss(int x, vector >&data) { data[x] = min(data[2*x], data[2*x+1]); if (x != 1) ss(x/2, data); } void go(int m, int q) { vector nums(m); for (int i = 0; i < m; i++) scanf("%d", &nums[i]); vector closest(m); map last; vector clo2(m, -1); for (int i = 0; i < m; i++) { if (last.count(nums[i])==0) { closest[i] = 1000000000; } else { closest[i] = i - last[nums[i]]; clo2[last[nums[i]]] = i; } last[nums[i]] = i; } vector > data(2097152); int pos = 1048576; for (int i = 0; i < m; i++) { data[i+pos] = make_pair(closest[i], i+1); } for (int i = pos-1; i > 0; i--) { data[i] = min(data[2*i], data[2*i+1]); } vector, int> > Q(q); for (int i = 0; i < q; i++) { scanf("%d %d", &Q[i].first.first, &Q[i].first.second); Q[i].first.first--; Q[i].second = i; } sort(Q.begin(), Q.end()); vector out(q, -1); int ll = 0; for (int i = 0; i < q; i++) { for (int j = ll; j < Q[i].first.first; j++) { if (clo2[j] == -1) continue; data[clo2[j]+pos].first = 1000000000; ss((clo2[j]+pos)/2, data); } ll = Q[i].first.first; int b = Q[i].first.first; int e = Q[i].first.second; pair gg = get(b, e, 0, pos, 1, data); /* printf("%d %d %d\n", gg.first, gg.second, e-b); if (gg.first < e-b) { printf("%d\n", gg.second); } else { printf("OK\n"); }*/ if (gg.first < e-b) { out[Q[i].second] = gg.second; } } for (int i = 0; i < q; i++) { if (out[i] == -1) printf("OK\n"); else printf("%d\n", out[i]); } printf("\n"); } int main() { while(true) { int m, q; scanf("%d %d", &m, &q); if (m == 0 && q == 0) break; go(m, q); } }