DES:给出一个数列。然后有q个询问,对给定的区间内是否有重复的数。如果有输出任意一个重复的。如果没有输出OK。
开始以为是线段树。后来发现。只是水的比较隐蔽。感觉这个方法还是很聪明的。把每个点的最近的有重复的数的区间记录下来。这样每次询问都可以直接表示结果了。

1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 #include<map> 5 #define inf 0x3f3f3f3f 6 using namespace std; 7 8 map<int, int>mp; 9 int num[1000010]; 10 int id[1000010]; 11 12 int main() 13 { 14 int n, q; 15 while(cin >> n >> q) 16 { 17 if (n == 0 && q == 0) break; 18 for (int i=0; i<n; ++i) 19 { 20 cin >> num[i]; 21 } 22 23 mp.clear(); 24 id[n] = inf; 25 26 for (int i=n-1; i>=0; --i) 27 { 28 if (mp[num[i]] == 0) 29 { 30 id[i] = id[i+1]; 31 mp[num[i]] = i; 32 continue; 33 } 34 else 35 { 36 id[i] = min(mp[num[i]], id[i+1]); 37 mp[num[i]] = i; 38 } 39 } 40 41 while(q--) 42 { 43 int x, y; 44 cin >> x >> y; 45 x--; 46 y--; 47 if (y < id[x]) cout << "OK "; 48 else cout << num[id[x]] << endl; 49 } 50 cout << endl; 51 } 52 return 0; 53 }