use std::collections::HashSet; const LIMIT: usize = 1e6 as usize; fn main() { let mut n = String::new(); std::io::stdin().read_line(&mut n).ok(); let n: usize = n.trim().parse().unwrap(); let mut a = String::new(); std::io::stdin().read_line(&mut a).ok(); let a: Vec = a.trim().split_whitespace().map(|s| s.parse().unwrap()).collect(); let mut used_cnt = vec![0usize; LIMIT + 1]; for i in 0..n { let mut used = HashSet::new(); for j in 1..=(a[i] as f64).sqrt().floor() as usize { if a[i] % j == 0 { used.insert(j); used.insert(a[i]/j); } } for &v in used.iter() { used_cnt[v] += 1; } } let mut result = vec![0usize; n]; for i in (1..=LIMIT).rev() { if used_cnt[i] == 0 { continue; } let mut idx = n-used_cnt[i]; while idx < n && result[idx] == 0 { result[idx] = i; idx += 1; } } for &v in result.iter() { println!("{}", v); } }