fn getline() -> String { let mut ret = String::new(); std::io::stdin().read_line(&mut ret).unwrap(); ret } fn calc(xs: Vec, lim: i64) -> i64 { if lim == 1 { return 0; } let mut coo = xs.clone(); coo.push(0); coo.push(lim); for &x in &xs { coo.push((x + lim / 2) % lim); coo.push((x + lim - lim / 2) % lim); } coo.sort(); coo.dedup(); let m = coo.len(); let mut grad = vec![0; m]; let mut cur_grad = 0; let mut ma = 0; let mut cur = 0; for x in xs { let a = coo.binary_search(&x).unwrap(); let b = coo.binary_search(&((x + lim / 2) % lim)).unwrap(); let c = coo.binary_search(&((x + lim - lim / 2) % lim)).unwrap(); let mi = a.min(b).min(c); if mi == a { cur_grad -= 1; } else if mi == b { cur_grad += 1; } else { cur_grad += 0; } grad[a] += 2; grad[b] -= 1; grad[c] -= 1; cur += (lim - x).min(x); } for i in 0..m { ma = ma.max(cur); cur_grad += grad[i]; if i + 1 == m { break; } cur += cur_grad * (coo[i + 1] - coo[i]); } ma } fn main() { let ints = getline().trim() .split_whitespace() .map(|x| x.parse::().unwrap()) .collect::>(); let [n, x, y] = ints[..] else { panic!() }; let mut xs = vec![]; let mut ys = vec![]; for _ in 0..n { let ints = getline().trim() .split_whitespace() .map(|x| x.parse::().unwrap()) .collect::>(); let [a, b] = ints[..] else { panic!() }; xs.push(a - 1); ys.push(b - 1); } println!("{}", calc(xs, x) + calc(ys, y)); }