1 /*
2 题意:n个数的序列,m个询问,每次询问给你区间[l,r]问是否区间内有两个相同的数;
3 如果没有输出OK,有的话输出最右边满足的数的值;
4
5 分析:从左到右扫描一遍,给每个数记录它左边最近的相同数的标号,
6 那么区间[l,r]最大的标号如果还小于l那么就不存在相同的数;
7 用线段树维护,顺便记录下该数的下标;
8
9
10 */
11 #include<cstdio>
12 #include<cstring>
13 #include<cstdlib>
14 #include<iostream>
15 #include<cmath>
16 #include<algorithm>
17 #include<map>
18 #define lson l,m,rt<<1
19 #define rson m+1,r,rt<<1|1
20 using namespace std;
21 const int N=500000+10;
22 int mx[N<<2],id[N<<2],a[N],b[N];
23 map<int,int > mp;
24 void pushup(int rt){
25 if (mx[rt<<1]<=mx[rt<<1|1]){
26 mx[rt]=mx[rt<<1|1];id[rt]=id[rt<<1|1];
27 }else {
28 mx[rt]=mx[rt<<1];id[rt]=mx[rt<<1];
29 }
30 }
31 void build(int l,int r,int rt){
32 mx[rt]=id[rt]=-1;
33 if (l==r) {
34 mx[rt]=b[l];
35 id[rt]=l;
36 return;
37 }
38 int m=(l+r)>>1;
39 build(lson);build(rson);
40 pushup(rt);
41 }
42 typedef pair<int,int> pii;
43 pii query(int L,int R,int l,int r,int rt){
44 if (L<=l && r<=R){
45 return make_pair(mx[rt],id[rt]);
46 }
47 int m=(l+r)>>1;
48 pii u(-1,-1),v(-1,-1);
49 if (L<=m) u=query(L,R,lson);
50 if (m< R) v=query(L,R,rson);
51 if (u.first<=v.first) return v;
52 else return u;
53 }
54 int n,m;
55 int main(){
56 while (~scanf("%d",&n)){
57 for (int i=0;i<n;i++) scanf("%d",&a[i]);
58 mp.clear();
59 for (int i=0;i<n;i++){
60 if (mp.find(a[i])==mp.end()){
61 mp[a[i]]=i; b[i]=-1;
62 }
63 else {
64 b[i]=mp[a[i]];
65 mp[a[i]]=i;
66 }
67 }
68 build(0,n-1,1);
69 // cout<<mx[1]<<" "<<id[1]<<endl;
70 scanf("%d",&m);
71 for (int i=0;i<m;i++){
72 int x,y;scanf("%d%d",&x,&y);
73 x--,y--;
74 pii ret=query(x,y,0,n-1,1);
75 if (ret.first>=x) printf("%d\n",a[ret.second]);
76 else printf("OK\n");
77 }
78 printf("\n");
79 }
80 }