fn main() { let n = read(); let mut s = vec![0; n + 1]; s[n] = n * (n + 1) / 2; for i in 2..n { println!("? 1 {}", i); s[i] = read(); } println!("? 2 {}", n); s[1] = s[n] - read(); use util::*; println!("! {}", s.windows(2).map(|s| s[1] - s[0]).join(" ")); } fn read() -> usize { let mut s = String::new(); std::io::stdin().read_line(&mut s).unwrap(); s.trim().parse().unwrap() } mod util { pub trait Join { fn join(self, sep: &str) -> String; } impl Join for I where I: Iterator, T: std::fmt::Display, { fn join(self, sep: &str) -> String { let mut s = String::new(); use std::fmt::*; for (i, v) in self.enumerate() { if i > 0 { write!(&mut s, "{}", sep).ok(); } write!(&mut s, "{}", v).ok(); } s } } }