#![allow(non_snake_case)] use itertools::Itertools; use proconio::*; // https://maguro.dev/blog/debug-macro/ #[allow(unused_macros)] macro_rules! debug { ($($a:expr),* $(,)*) => { #[cfg(debug_assertions)] eprintln!(concat!($("| ", stringify!($a), " = {:?} "),*, "|"), $(&$a),*); }; } fn main() { std::thread::Builder::new() .stack_size(256 * 1024 * 1024) .spawn(solve) .unwrap() .join() .unwrap(); } // K 個飛ばしで sort する // swap 回数は転倒数 // sort して 全体が sort されてれば OK fn solve() { input! { n: usize, k: usize, p: [usize; n] } let mut sorted = vec![0; n]; let mut res = vec![]; for s in 0..k { let mut v = vec![]; for i in (0..).take_while(|&u| s + u * k < n) { v.push(p[s + i * k]); } let m = v.len(); while !v.is_sorted() { for i in 0..m - 1 { if v[i] > v[i + 1] { v.swap(i, i + 1); res.push((s + i * k + 1, s + (i + 1) * k + 1)); } } } for i in 0..m { sorted[s + k * i] = v[i]; } } if sorted.is_sorted() { println!("{}", res.len()); println!("{}", res.into_iter().map(|(i, j)| format!("{i} {j}")).join("\n")); } else { println!("-1") } }