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());
}