Problem:
B: ピボット (Pivots)

問題

1 から N までの整数を並び変えた、長さ N の順列 a_1, a_2, ..., a_N が与えられる。
また、この順列に対して Q 個のクエリが順に与えられる。i 番目のクエリでは次の操作をしなければならない。

値 q_i (1 \leq q_i \leq N) が与えられる。順列 \{a_1, a_2, ..., a_N\} において q_i の左側の順列を L、q_i の右側の順列を R としたとき、元の順列 L \ \ q_i \ \ R を R \ \ q_i \ \ L に変更する。つまり、q_{i} = a_j であるとき、順列 \{a_1, ..., a_{j-1}, a_j, a_{j+1}, ..., a_N\} を \{a_{j+1}, ..., a_N, a_j, a_1, ..., a_{j-1}\} に変更する。

なお、順列 L, R は空になることもあり得る。例えば L が空の時は、q_i \ \ R を R \ \ q_i に変更する。R が空のときについても同様である。

与えられた順列に対してこれら Q 個のクエリを順に処理した後の順列を一行に出力せよ。

入力形式

N Q
a_1 a_2 ... a_N
q_1 q_2 ... q_Q

入力は全て整数である。

一行目には順列の要素数 N とクエリの回数 Q が空白区切りで与えられる。
二行目には 1 から N までの整数を並び変えた順列 a_1, a_2, ..., a_N が空白区切りで与えられる。
三行目にはクエリが Q 個、空白区切りで与えられる。q_i は i 番目のクエリを表す。

制約

1 \leq N \leq 10^5

1 \leq Q \leq 10^5

1 \leq a_i \leq N

a_i は相異なる

1 \leq q_i \leq N

出力形式

クエリを順にすべて処理した後の順列を一行に出力せよ。

入力例1

5 2
1 5 3 2 4
5 2

出力例1

4 5 1 2 3

1番目のクエリにより、順列は \{3, 2, 4, 5, 1\} へ変わる。

2番目のクエリにより、順列は \{4, 5, 1, 2, 3\} へ変わる。

入力例2

5 1
1 2 3 4 5
5

出力例2

5 1 2 3 4

Solution in Rust (judge verdict: Accepted)

/// Thank you tanakh!!!
///  https://qiita.com/tanakh/items/0ba42c7ca36cd29d0ac8
macro_rules! input {
    (source = $s:expr, $($r:tt)*) => {
        let mut iter = $s.split_whitespace();
        input_inner!{iter, $($r)*}
    };
    ($($r:tt)*) => {
        let mut 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")
    };
}

const INF: usize = 1e10 as usize;

fn main() {
    input!(n: usize, q: usize, a: [usize1; n], queries: [usize1; q]);

    let mut next = vec![INF; n];
    let mut prev = vec![INF; n];

    for i in 0..n {
        if i > 0 {
            prev[a[i]] = a[i - 1];
        }
        if i < n - 1 {
            next[a[i]] = a[i + 1];
        }
    }

    let mut start = a[0];
    let mut end = a[n - 1];

    for &q in queries.iter() {
        match (prev[q], next[q]) {
            (INF, INF) => {
                // do nothing
            }
            (INF, _) => {
                start = next[q];
                prev[start] = INF;

                prev[q] = end;
                next[q] = INF;

                next[end] = q;
                end = q;
            }
            (_, INF) => {
                end = prev[q];
                next[end] = INF;

                prev[q] = INF;
                next[q] = start;

                prev[start] = q;
                start = q;
            }
            _ => {
                let a = start;
                let b = prev[q];
                let c = next[q];
                let d = end;

                start = c;
                prev[c] = INF;

                prev[q] = d;
                next[d] = q;

                next[q] = a;
                prev[a] = q;

                next[b] = INF;
                end = b;
            }
        }
    }

    let mut cur = start;
    for i in 0..n {
        if i > 0 {
            print!(" ");
        }
        print!("{}", cur + 1);
        cur = next[cur];
    }
    println!();
}