Tree Diameter
Contest: Forethought Future Cup - Elimination Round
Difficulty rating: 1700
Tags: bitmasks, graphs, interactive

There is a weighted tree with $$$n$$$ nodes and $$$n-1$$$ edges. The nodes are conveniently labeled from $$$1$$$ to $$$n$$$. The weights are positive integers at most $$$100$$$. Define the distance between two nodes to be the sum of edges on the unique path between the nodes. You would like to find the diameter of the tree. Diameter is the maximum distance between a pair of nodes.

Unfortunately, the tree isn't given to you, but you can ask some questions about it. In one question, you can specify two nonempty disjoint sets of nodes $$$p$$$ and $$$q$$$, and the judge will return the maximum distance between a node in $$$p$$$ and a node in $$$q$$$. In the words, maximum distance between $$$x$$$ and $$$y$$$, where $$$x \in p$$$ and $$$y \in q$$$. After asking not more than $$$9$$$ questions, you must report the maximum distance between any pair of nodes.

Interaction format:
Each test contains multiple test cases. The first line contains the number of test cases $$$t$$$ ($$$1 \le t \le 1\,000$$$). Description of the test cases follows.

The first line of each test case contains an integer $$$n$$$ ($$$2 \leq n \leq 100$$$) — the number of nodes in the tree.

To ask a question, print "$$$k_1\ k_2\ a_1\ a_2\ \ldots\ a_{k_1}\ b_1\ b_2\ \ldots\ b_{k_2}$$$" $$$(k_1, k_2 \geq 1$$$ and $$$k_1+k_2 \leq n$$$). These two sets must be nonempty and disjoint. The judge will respond with a single integer $$$\max_{p,q} dist(a_p, b_q)$$$. If you ever get a result of $$$-1$$$ (because you printed an invalid query), exit immediately to avoid getting other verdicts.

After printing a query do not forget to output end of line and flush the output. Otherwise, you will get Idleness limit exceeded. To do this, use:

- fflush(stdout) or cout.flush() in C++;
- System.out.flush() in Java;
- flush(output) in Pascal;
- stdout.flush() in Python;
- see documentation for other languages.

When you are ready to answer, print "$$$-1\ d$$$", where $$$d$$$ is the maximum shortest distance over all pairs of nodes.

You can only ask at most $$$9$$$ questions per test case.

Hack Format

To hack, use the following format. Note that you can only hack with one test case.

The first line should contain a single integer $$$t$$$ ($$$t=1$$$).

The second line should contain a single integer $$$n$$$ ($$$2 \leq n \leq 100$$$).

Each of the next $$$n-1$$$ lines should contain three integers $$$a_i, b_i, c_i$$$ ($$$1\leq a_i, b_i\leq n$$$, $$$1 \leq c_i \leq 100$$$). This denotes an undirected edge between nodes $$$a_i$$$ and $$$b_i$$$ with weight $$$c_i$$$. These edges must form a tree.

Constraints:
Time limit: 4.0 s
Memory limit: 256.0 MB

Note:
In the first example, the first tree looks as follows:

In the first question, we have $$$p = {1}$$$, and $$$q = {2, 3, 4, 5}$$$. The maximum distance between a node in $$$p$$$ and a node in $$$q$$$ is $$$9$$$ (the distance between nodes $$$1$$$ and $$$5$$$).

The second tree is a tree with two nodes with an edge with weight $$$99$$$ between them.

Example input:
2
5
9
6
10
9
10
2
99

Example output:
1 4 1 2 3 4 5
1 4 2 3 4 5 1
1 4 3 4 5 1 2
1 4 4 5 1 2 3
1 4 5 1 2 3 4
-1 10
1 1 1 2
-1 99

Editorial:
The standard algorithm for finding the diameter of a tree is to find the farthest distance from node $$$1$$$, then find the farthest distance from that node. We can do the same technique in this problem.
We use one question to get the farthest distance from node $$$1$$$ in the graph. Then, we use binary search to figure out which node is actually the farthest away (if there are ties, it doesn't matter which one we choose). More specifically, if we know the farthest node lies in some subset $$$S$$$, we can ask about half of the element in $$$S$$$. If the distance doesn't decrease, then we know the farthest node must be in the half we asked about, otherwise, it is in the other half. This will use an additional 7 questions.
We use the last question to get the actual diameter.
There's another way that uses fewer questions and also ignores the fact that the graph is a tree. We can state the problem instead as trying to find $$$7$$$ splits of numbers so that every pair of numbers is separated in at least one split. We can do this by looking at the binary representation of the numbers. In the i-th question, let $$$p$$$ be the set of all numbers with the i-th bit set and $$$q$$$ be the other numbers. Every pair has at most 7 bits, and each pair of numbers differs in at least one bit, so this satisfies what we are looking for.
After asking all questions, we can print the maximum result we found from all of them.