Problem:
Score : 700 points

Problem Statement

We have a sequence of N \times K integers: X=(X_0,X_1,\cdots,X_{N \times K-1}).
Its elements are represented by another sequence of N integers: A=(A_0,A_1,\cdots,A_{N-1}). For each pair i, j (0 \leq i \leq K-1,\ 0 \leq j \leq N-1), X_{i \times N + j}=A_j holds.

Snuke has an integer sequence s, which is initially empty.
For each i=0,1,2,\cdots,N \times K-1, in this order, he will perform the following operation:

If s does not contain X_i: add X_i to the end of s.

If s does contain X_i: repeatedly delete the element at the end of s until s no longer contains X_i. Note that, in this case, we do not add X_i to the end of s.

Find the elements of s after Snuke finished the operations.

Constraints

1 \leq N \leq 2 \times 10^5

1 \leq K \leq 10^{12}

1 \leq A_i \leq 2 \times 10^5

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N K
A_0 A_1 \cdots A_{N-1}

Output

Print the elements of s after Snuke finished the operations, in order from beginning to end, with spaces in between.

Sample Input 1

3 2
1 2 3

Sample Output 1

2 3

In this case, X=(1,2,3,1,2,3).
We will perform the operations as follows:

i=0: s does not contain 1, so we add 1 to the end of s, resulting in s=(1).

i=1: s does not contain 2, so we add 2 to the end of s, resulting in s=(1,2).

i=2: s does not contain 3, so we add 3 to the end of s, resulting in s=(1,2,3).

i=3: s does contain 1, so we repeatedly delete the element at the end of s as long as s contains 1, which causes the following changes to s: (1,2,3)→(1,2)→(1)→().

i=4: s does not contain 2, so we add 2 to the end of s, resulting in s=(2).

i=5: s does not contain 3, so we add 3 to the end of s, resulting in s=(2,3).

Sample Input 2

5 10
1 2 3 2 3

Sample Output 2

3

Sample Input 3

6 1000000000000
1 1 2 2 3 3

Sample Output 3

s may be empty in the end.

Sample Input 4

11 97
3 1 4 1 5 9 2 6 5 3 5

Sample Output 4

9 2 6

Solution in Rust (1.15.1) (judge verdict: Wrong Answer)

#![allow(unused_imports)]

use std::cell::RefCell;
use std::cmp::{max, min, Ordering};
use std::collections::*;
use std::fmt::{Debug, Formatter, Write as FmtWrite};
use std::io::{stderr, stdin, BufRead, Write};
use std::mem::{replace, swap};
use std::ops::*;
use std::rc::Rc;

// -----------------------------------------------
// Framework <https://github.com/vain0x/procon>
// -----------------------------------------------

//
// Macro debug!
//

#[cfg(debug_assertions)]
include!{"./procon/debug.rs"}

#[cfg(not(debug_assertions))]
macro_rules! debug {
    ($($arg:expr),*) => {};
}

//
// Macro input!
//

macro_rules! input {
    (source = $s:expr, $($r:tt)*) => {
        let mut iter = $s.split_whitespace();
        input_inner!{iter, $($r)*}
    };
    ($($r:tt)*) => {
        let s = {
            use std::io::Read;
            let mut s = String::new();
            std::io::stdin().read_to_string(&mut s).unwrap();
            s
        };
        let mut iter = s.split_whitespace();
        input_inner!{iter, $($r)*}
    };
}

macro_rules! input_inner {
    ($iter:expr) => {};
    ($iter:expr, ) => {};

    ($iter:expr, $var:ident : $t:tt $($r:tt)*) => {
        let $var = read_value!($iter, $t);
        input_inner!{$iter $($r)*}
    };
}

macro_rules! read_value {
    ($iter:expr, ( $($t:tt),* )) => {
        ( $(read_value!($iter, $t)),* )
    };

    ($iter:expr, [ $t:tt ; $len:expr ]) => {
        (0..$len).map(|_| read_value!($iter, $t)).collect::<Vec<_>>()
    };

    ($iter:expr, chars) => {
        read_value!($iter, String).chars().collect::<Vec<char>>()
    };

    ($iter:expr, usize1) => {
        read_value!($iter, usize) - 1
    };

    ($iter:expr, $t:ty) => {
        $iter.next().unwrap().parse::<$t>().expect("Parse error")
    };
}

//
// IteratorExt
//

trait IteratorExt: Iterator + Sized {
    fn vec(self) -> Vec<Self::Item> {
        self.collect()
    }
}

impl<T: Iterator> IteratorExt for T {}


//
// Main
//

#[derive(Debug, Clone)]
struct Cons {
    value: usize,
    curr: usize,
    next: usize,
    next_orig: usize,
    overwrap: usize,
}

fn main() {
    input! {
        n: usize,
        k: u64,
        xs: [usize; n],
    }
    let k = k - 1;

    debug!(n);
    debug!(k);
    debug!(xs);

    const MAX: usize = (2.0 * 1e5 + 1.0) as usize;
    let mut next_values = vec![0; MAX];
    for i in (0..n).rev() {
        next_values[xs[i]] = i;
    }

    let mut edges = vec![];
    for i in (0..n).rev() {
        let j = (next_values[xs[i]] + 1) % n;
        edges.push(Cons {
            value: xs[i],
            curr: i,
            next: j,
            next_orig: next_values[xs[i]],
            overwrap: if j <= (i + 1) { 1 } else { 0 },
        });
        next_values[xs[i]] = i;
    }
    edges.reverse();

    debug!(edges);

    // Notice that G = (V, E) where V = xs, E = edges, can be regarded as a directed simple graph.
    // Each connected component is a loop.
    // Futhermore, for all v in V, there is just one e in E s.t. source (resp. target) of e is v.
    // Proof:
    //   It is enough to show that f: E -> V; e -> target(e) is injective.
    //   This follows from g: E -> V; e -> source(e) is injective and #V = #E is finite.

    // Take the connected component containing 0.
    let mut chain = vec![];
    let mut next = 0;
    for _ in 0..n {
        let e = edges[next].clone();
        next = e.next;
        chain.push(e);
        if next == 0 {
            break;
        }
    }

    let chain_overwrap: usize = chain.iter().map(|ref e| e.overwrap).sum();

    debug!(chain);
    debug!(chain_overwrap);

    let mut c = (k % (chain_overwrap as u64)) as usize;
    let mut next = 0;
    for e in &chain {
        if c == 0 {
            break;
        }

        c -= e.overwrap;
        next = e.next;
    }

    let mut rs = vec![];
    loop {
        let e = &edges[next];

        if next < e.next_orig {
            next = e.next_orig + 1;
        } else {
            rs.push(e.value);
            next = next + 1;
        }

        if next == n {
            break;
        }
    }

    debug!(rs);

    println!("{}", rs.iter().map(|&r| format!("{}", r)).vec().join(" "));
}