Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

The Smallest Window II

For a given array $a_1, a_2, a_3, ... , a_N$ of $N$ elements and an integer $K$, find the smallest sub-array size (smallest window length) where the elements in the sub-array contains all integers in range [$1, 2, ..., K$]. If there is no such sub-array, report 0.

Constraints

$1 \leq N \leq 10^5$

$1 \leq K \leq 10^5$

$1 \leq a_i \leq 10^5$

Input

The input is given in the following format.

$N$ $K$

$a_1$ $a_2$ ... $a_N$

Output

Print the smallest sub-array size in a line.

Sample Input 1

6 2
4 1 2 1 3 5

Sample Output 1

2

Sample Input 2

6 3
4 1 2 1 3 5

Sample Output 2

3

Sample Input 3

3 4
1 2 3

Sample Output 3

0

Solution in Rust (judge verdict: Accepted)

use std::cmp::min;
use std::io;
use std::io::prelude::*;

fn main() {
    let mut stdin = io::stdin();
    let mut buf = String::new();
    let _ = stdin.read_to_string(&mut buf);
    let mut iter = buf.split_whitespace();

    let n: usize = iter.next().unwrap().parse().unwrap();
    let k = iter.next().unwrap().parse().unwrap();
    let a: Vec<usize> = iter.map(|nstr| nstr.parse().unwrap()).collect();

    let mut i = 0;
    let mut j = 0;
    let mut occ = vec![0; k + 1];
    let mut dis = 0;
    let mut ans = std::usize::MAX;
    while j < n && ans > k {
        if a[j] <= k {
            if occ[a[j]] == 0 {
                dis += 1;
            }
            occ[a[j]] += 1;
        }
        j += 1;
        while a[i] > k || occ[a[i]] > 1 {
            if a[i] <= k {
                occ[a[i]] -= 1;
            }
            i += 1;
        }
        if dis == k {
            ans = min(ans, j - i);
        }
    }
    if ans == std::usize::MAX {
        ans = 0;
    }

    println!("{}", ans);
}