The array a with n integers is given. Let's call the sequence of one or more consecutive elements in a segment. Also let's call the segment k-good if it contains no more than k different values.
Find any longest k-good segment.
As the input/output can reach huge size it is recommended to use fast input/output methods: for example, prefer to use scanf/printfinstead of cin/cout in C++, prefer to use BufferedReader/PrintWriter instead of Scanner/System.out in Java.
The first line contains two integers n, k (1 ≤ k ≤ n ≤ 5·105) — the number of elements in a and the parameter k.
The second line contains n integers ai (0 ≤ ai ≤ 106) — the elements of the array a.
Print two integers l, r (1 ≤ l ≤ r ≤ n) — the index of the left and the index of the right ends of some k-good longest segment. If there are several longest segments you can print any of them. The elements in a are numbered from 1 to n from left to right.
Examples
input
5 5
1 2 3 4 5
output
1 5
input
9 3
6 5 1 2 3 2 1 4 5
output
3 7
input
3 1
1 2 3
output
1 1
类似poj3320
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+5;
int a[maxn], n, k;
int main(void)
{
while(cin >> n >> k)
{
map<int, int> m;
m.clear();
for(int i = 0; i < n; i++) scanf("%d", &a[i]);
int ans = 0, s = 0, e = -1, l = 1, r = n;
while(1)
{
while(e < n && m.size() <= k)
m[a[++e]]++;
if(m.size() <= k) break;
if(e-s > ans)
{
ans = e-s;
l = s+1, r = e;
}
if(m[a[s]] == 1) m.erase(a[s]);
else m[a[s]]--;
s++;
}
printf("%d %d\n", l, r);
}
return 0;
}