use std::fmt::Write; use proconio::{input, marker::Usize1}; fn main() { input! { n: usize, k_a: usize, k_b: usize, a: [Usize1; k_a], b: [Usize1; k_b], q: usize, query: [(Usize1, Usize1); q], } let dist = |a: &[usize]| { let mut res = vec![!0; n]; let k = a.len(); let mut j = 0; for i in 0..n { if j > 0 { res[i] = res[i].min(i.abs_diff(a[j - 1])); } if j < k { res[i] = res[i].min(i.abs_diff(a[j])); } if j < k && i == a[j] { j += 1; } } res }; let dist_a = dist(&a); let dist_b = dist(&b); let dist_ab = { let mut mixed = Vec::with_capacity(k_a + k_b); for &a in &a { mixed.push((a, true)); } for &b in &b { mixed.push((b, false)); } mixed.sort_unstable_by_key(|t| t.0); mixed .windows(2) .filter_map(|w| { if w[0].1 != w[1].1 { Some(w[1].0 - w[0].0) } else { None } }) .min() .unwrap() }; eprintln!("{:?}", dist_ab); let mut output = String::new(); for (s, t) in query { let d = s.abs_diff(t); let d_a = dist_a[s] + dist_a[t]; let d_b = dist_b[s] + dist_b[t]; let d_ab = dist_a[s] + dist_ab + dist_b[t]; let d_ba = dist_b[s] + dist_ab + dist_a[t]; let ans = d.min(d_a).min(d_b).min(d_ab).min(d_ba); writeln!(&mut output, "{ans}").unwrap(); } println!("{}", output.trim_end()); }