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: Time Limit Exceeded)

#![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 Next {
    value: usize,
    curr: usize,
    next: usize,
    overwrap: usize,
}

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

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

    let mut ys = xs.iter().map(|&x| (x, 0)).vec();
    ys.append(&mut xs.iter().map(|&x| (x, 1)).vec());
    debug!(ys);

    let mut next_table = vec![];
    'outer: for i in 0..n {
        for j in (i+1)..(2 * n) {
            if xs[i] == ys[j].0 {
                next_table.push(Next {
                    value: ys[j].0,
                    curr: i,
                    next: (j + 1) % n,
                    overwrap: min(1, (j + 1) / n),
                });
                continue 'outer;
            }
        }
        unreachable!();
    }

    debug!(next_table);

    let mut chain = vec![];
    let mut checked = vec![None; n];
    let mut next = 0;
    let mut loop_init = 0;
    for i in 0..n {
        match checked[next] {
            Some(j) => {
                loop_init = j;
                break;
            },
            None => {
                checked[next] = Some(i);
                let nt = next_table[next].clone();
                next = nt.next;
                chain.push(nt);
            }
        }
    }

    debug!(loop_init);
    debug!(chain);

    let mut init_part = 0;
    let mut loop_part = 0;

    for i in 0..loop_init {
        init_part += chain[i].overwrap;
    }
    for i in loop_init..chain.len() {
        loop_part += chain[i].overwrap;
    }

    debug!(init_part);
    debug!(loop_part);

    let pos = if k <= (init_part as u64) {
        let mut c = k;
        let mut pos = 0;

        for next in &chain[..loop_init] {
            if c == 0 && next.overwrap > 0 {
                pos = next.curr;
                break;
            }

            c -= next.overwrap as u64;
        }

        pos
    } else {
        let mut c = (k - (init_part as u64)) % (loop_part as u64);
        let mut pos = 0;

        for next in &chain[loop_init..] {
            debug!(c);
            debug!(next);
            if c == 0 && next.overwrap > 0 {
                pos = next.curr;
                break;
            }            

            c -= next.overwrap as u64;
        }

        pos
    };

    debug!(pos);

    let xs = &xs[pos..];
    let mut ys = vec![];

    for x in xs {
        let mut truncate = false;
        for i in 0..ys.len() {
            if x == ys[i] {
                truncate = true;
                ys.truncate(i);
                break;
            }
        }

        if !truncate {
            ys.push(x);
        }
    }

    debug!(ys);

    for (i, &y) in ys.iter().enumerate() {
        print!("{}{}", if i == 0 { "" } else { " " }, y)
    }
    println!("");
}