use std::cmp::{max, min}; use std::io; fn main() { let mut buffer = String::new(); io::stdin().read_line(&mut buffer).unwrap(); let n: usize = buffer.trim().parse().unwrap(); let mut plan = vec![]; for _ in 0..n { let mut buffer = String::new(); io::stdin().read_line(&mut buffer).unwrap(); let mut iter = buffer.trim().split_whitespace(); let x: i64 = iter.next().unwrap().parse().unwrap(); let y: i64 = iter.next().unwrap().parse().unwrap(); plan.push((x, y)); } let target = 10_i64.pow(17) * 5; let mut ans = vec![]; for i in 0..50 { let mut min_diff = 0; let mut tmp = (n, n); for p in 0..n { for q in p + 1..n { let prev_diff = max((plan[p].0 - target).abs(), (plan[q].0 - target).abs()) + max((plan[p].1 - target).abs(), (plan[q].1 - target).abs()); let new_0 = (plan[p].0 + plan[q].0) / 2; let new_1 = (plan[p].1 + plan[q].1) / 2; let new_diff = (new_0 - target).abs() + (new_1 - target).abs(); if(min_diff > new_diff - prev_diff) { min_diff = new_diff - prev_diff; tmp = (p, q); } } } if min_diff == 0 { break; } plan[tmp.0].0 = (plan[tmp.0].0 + plan[tmp.1].0) / 2; plan[tmp.1].0 = (plan[tmp.0].0 + plan[tmp.1].0) / 2; plan[tmp.0].1 = (plan[tmp.0].1 + plan[tmp.1].1) / 2; plan[tmp.1].1 = (plan[tmp.0].1 + plan[tmp.1].1) / 2; ans.push(tmp); } println!("{}", ans.len()); for a in ans { println!("{} {}", a.0 + 1, a.1 + 1); } }