#[allow(unused_imports)] use std::cmp::*; #[allow(unused_imports)] use std::collections::*; use std::io::Read; 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![]; for i in 0..n { let mut last = 0; for _ in 0..f[i] { let mut pass = last; let mut fail = init.len() + 1; while fail - pass > 1 { let mid = (fail + pass) / 2; let mut tmp = init[..mid].to_vec(); tmp.push(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!(); }