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 }