题意:告诉你1-n的区间,每个数对应一个整数,然后有一堆查询的操作,问查询的区间是否有重复的整数。
分析:
很好的一道题目,错了很久。
建立一个f数组,记录从当前位置向后匹配的最小区间。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#define maxn 3000010
using namespace std;
int m,n,q;
int a[maxn],f[maxn]; //f记录从当前位置向后匹配的最小区间int main(){std::ios::sync_with_stdio(false);while(cin>>m>>q){if(m==0&&q==0) break;for(int i=1;i<=m;i++) cin>>a[i];memset(f,0,sizeof(f));map<int,int> mp;f[m]=m+1;mp[a[m]]=m;for(int i=m-1;i>=1;i--){if(mp[a[i]]==0) f[i]=f[i+1];else f[i]=min(mp[a[i]],f[i+1]);mp[a[i]]=i;}int l,r;while(q--){cin>>l>>r;if(f[l]>r) cout<<"OK"<<endl;else cout<<a[f[l]]<<endl;}cout<<endl;}return 0;
}