fn getline() -> String { let mut ret = String::new(); std::io::stdin().read_line(&mut ret).unwrap(); ret } fn ask(v: &[usize]) -> bool { print!("?"); print!(" {}", v.len()); for &v in v { print!(" {}", v + 1); } println!(); let x = getline().trim().to_string(); x == "Yes" } fn main() { let n: usize = getline().trim().parse().unwrap(); let mut f = vec![0; n]; let mut qs = 0; for i in 0..n { let mut x = 0; loop { qs += 1; if !ask(&vec![i; x + 1]) { break; } x += 1; } f[i] = x; } // eprintln!("f = {:?}", f); let mut init = vec![0; f[0]]; for i in 1..n { let mut last = 0; for _ in 0..f[i] { let mut tmp = init[last..].to_vec(); tmp.insert(0, i); qs += 1; if ask(&tmp) { init.insert(last, i); last += 1; continue; } let mut fail = last; let mut pass = init.len(); while pass - fail > 1 { let mid = (fail + pass) / 2; let mut tmp = init[mid..].to_vec(); tmp.insert(0, i); qs += 1; if ask(&tmp) { pass = mid; } else { fail = mid; } } init.insert(pass, i); last = pass + 1; } } eprintln!("qs = {qs}"); print!("!"); for v in init { print!(" {}", v + 1); } println!(); }