#nullable enable #region var (_input, _iter) = (Array.Empty(), 0); T I() where T : IParsable { while (_iter >= _input.Length) (_input, _iter) = (Console.ReadLine()!.Trim().Split(' '), 0); return T.Parse(_input[_iter++], null); } #endregion bool AskGG(List a, List b) { Console.WriteLine($"? {a.Count} {b.Count} {string.Join(' ', a)} { string.Join(' ', b)}"); return I() == 1; } bool AskVV(int u, int v) { Console.WriteLine($"? {1} {1} {u} {v}"); return I() == 1; } var ez = new List<(int, int)>(); void Solve(List a) { var h = a.Count; if (h <= 1) return; h >>= 1; var a1 = a[..h]; var a2 = a[h..]; Solve2(a1, a2); Solve(a1); Solve(a2); } void Solve2(List a1, List a2) { if (a1.Count > a2.Count) (a1, a2) = (a2, a1); if (a1.Count == 0) return; if (a2.Count == 1) { var u = a1[0]; var v = a2[0]; if (AskVV(u, v)) ez.Add((u, v)); return; } if (!AskGG(a1, a2)) return; var h = a2.Count >> 1; Solve2(a1, a2[..h]); Solve2(a1, a2[h..]); } var n = I(); var a0 = Enumerable.Range(1, n).ToArray(); var random = new Random(1); random.Shuffle(a0); Solve([.. a0]); Console.WriteLine($"! {ez.Count}"); foreach (var (u, v) in ez) Console.WriteLine($"{u} {v}");