#![allow(unused_imports)] //use itertools::{iproduct, Itertools}; use proconio::input; use proconio::marker::*; use std::collections::*; fn main() { input! { n:usize, p:[Usize1;n], } let mut nexts = vec![None; n]; let mut prevs = vec![None; n]; for i in 0..n { if i != n - 1 { nexts[p[i]] = Some(p[i + 1]); } if i != 0 { prevs[p[i]] = Some(p[i - 1]); } } let mut rem = (0..n).collect::>(); let mut ans = vec![]; while !rem.is_empty() { let fst = *rem.first().unwrap(); if let Some(nxt) = nexts[fst] { ans.push(fst); ans.push(nxt); match (prevs[fst], nexts[nxt]) { (Some(pre), Some(nnxt)) => { nexts[pre] = Some(nnxt); prevs[nnxt] = Some(pre); } (Some(pre), None) => { nexts[pre] = None; } (None, Some(nnxt)) => { prevs[nnxt] = None; } _ => (), } rem.remove(&fst); rem.remove(&nxt); continue; } let scn = *rem.iter().nth(1).unwrap(); if let Some(nxt) = nexts[scn] { ans.push(scn); ans.push(nxt); match (prevs[scn], nexts[nxt]) { (Some(pre), Some(nnxt)) => { nexts[pre] = Some(nnxt); prevs[nnxt] = Some(pre); } (Some(pre), None) => { nexts[pre] = None; } (None, Some(nnxt)) => { prevs[nnxt] = None; } _ => (), } rem.remove(&scn); rem.remove(&nxt); } } for i in 0..n { print!("{} ", ans[i] + 1); } println!(); }