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; let mut howmany = 0; for i in 0..n - 1 { let mut x = 0; while howmany < n { qs += 1; if !ask(&vec![i; x + 1]) { break; } x += 1; howmany += 1; } f[i] = x; } f[n - 1] = n - howmany; // eprintln!("f = {:?}", f); let mut init = vec![0; f[0]]; for i in 1..n { eprintln!("init = {init:?}"); let mut last = 0; let mut lastseg = 0; for _ in 0..f[i] { let mut tmp = init[lastseg..].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; lastseg = pass; } } eprintln!("qs = {qs}"); assert!(qs <= 5000); print!("!"); for v in init { print!(" {}", v + 1); } println!(); }