Это сложная версия задачи. Единственное отличие между двумя версиями заключается в том, что в сложной версии дерево может иметь любую форму.
Эта задача интерактивная.
Бодлер очень богат, поэтому он купил дерево размером $$$n$$$, корень которого находится в произвольной вершине. Кроме того, каждая вершина имеет значение $$$1$$$ или $$$-1$$$.
Коровка-Нерд увидела дерево и влюбилась в него. Однако компьютерные науки не приносят ей достаточно денег, поэтому она не может позволить себе его купить. Бодлер решил сыграть с Коровкой-Нерд в игру, и если она выиграет, он подарит ей дерево.
Коровка-Нерд не знает, какая вершина является корнем, и она также не знает значений вершин. Однако она может задавать Бодлеру запросы двух типов:
Коровка-Нерд выигрывает, если она правильно угадает значение каждой вершины (значения финального дерева, после выполнения запросов) за $$$n + 200$$$ запросов. Можете ли вы помочь ей выиграть?
Первая строка входных данных содержит одно целое число $$$t$$$ $$$(1 \le t \le 100)$$$ — количество наборов входных данных.
Первая строка каждого набора входных данных содержит одно целое число $$$n$$$ $$$(2 \le n \le 10^3)$$$ — размер дерева.
Каждая из следующих $$$n-1$$$ строк содержит два целых числа $$$u$$$ и $$$v$$$ $$$(1 \le u, v \le n, u \neq v)$$$, обозначающих ребро между вершинами $$$u$$$ и $$$v$$$ в дереве.
Гарантируется, что сумма $$$n$$$ по всем наборам входных данных не превышает $$$10^3$$$ и что каждый предоставленный граф является деревом.
Чтобы задать запрос типа $$$1$$$, выведите строку в следующем формате (без кавычек):
Жюри вернет одно целое число, $$$f(u_1) + f(u_2) + ... + f(u_k)$$$.
Чтобы задать запрос типа $$$2$$$, выведите строку в следующем формате:
Жюри изменит значение вершины $$$u$$$: если его значение равно $$$1$$$, оно станет $$$-1$$$, и наоборот.
Когда вы найдете ответ, выведите одну строку в следующем формате:
После этого продолжайте обрабатывать следующий набор входных данных или завершите программу, если это был последний набор входных данных. Печать ответа не считается запросом.
Интерактор не адаптивен, что означает, что значения дерева известны до того, как участник задает запросы.
Если ваша программа сделает более $$$n + 200$$$ запросов, ваша программа должна немедленно завершиться, чтобы получить вердикт Неправильный ответ. В противном случае вы можете получить произвольный вердикт, потому что ваше решение продолжит читать из закрытого потока.
После вывода запроса не забудьте вывести конец строки и сбросить вывод. В противном случае вы можете получить вердикт Превышен лимит бездействия. Для этого используйте:
Хаки
Для хаков используйте следующий формат.
Первая строка должна содержать одно целое число $$$t$$$ $$$(1 \le t \le 100)$$$ — количество наборов входных данных.
Первая строка каждого набора входных данных должна содержать ровно два целых числа $$$n$$$ и $$$root$$$ $$$(2 \le n \le 10^3, 1 \le root \le n)$$$ — размер дерева и корень дерева.
Вторая строка каждого набора входных данных должна содержать ровно $$$n$$$ целых чисел $$$a_1, a_2, ..., a_n$$$ $$$(|a_i| = 1)$$$ — где $$$a_i$$$ — значение вершины $$$i$$$.
Каждая из следующих $$$n-1$$$ строк должна содержать ровно два целых числа $$$u$$$ и $$$v$$$ $$$(1 \le u, v \le n)$$$ — обозначающих ребро дерева между вершинами $$$u$$$ и $$$v$$$.
Сумма $$$n$$$ по всем наборам входных данных не должна превышать $$$10^3$$$, и каждый предоставленный граф должен быть допустимым деревом.
3 4 1 4 4 2 2 3 1 -1 -5 -5 2 1 2 2 7 1 2 2 7 7 3 7 4 7 5 7 6 -1
? 1 3 1 2 4 ? 1 2 3 1 ? 2 4 ? 1 3 1 2 4 ? 1 2 3 1 ! -1 -1 -1 -1 ? 1 1 1 ! 1 1 ? 1 1 1 ! -1 1 1 1 1 1 -1
В первом примере корнем дерева является вершина $$$4$$$, а значения: $$$[-1, -1, -1, 1]$$$ (значение $$$i$$$-й вершины — это значение вершины $$$i$$$).
Изначально $$$f(1) = 0, f(2) = 0, f(3) = -1, f(4) = 1$$$. Поэтому ответ на наш первый запрос — это $$$f(1) + f(2) + f(4) = 1$$$, а на второй запрос — это $$$f(3) + f(1) = -1$$$.
После изменения значения вершины $$$4$$$ значения становятся $$$[-1, -1, -1, -1]$$$. Кроме того, $$$f(1) = -2, f(2) = -2, f(3) = -3, f(4) = -1$$$. Поэтому $$$f(1) + f(2) + f(4) = -5$$$ и $$$f(3) + f(1) = -5$$$.
Мы отвечаем, что финальные значения вершин равны $$$[-1, -1, -1, -1]$$$, что верно. Обратите внимание, что мы сообщаем значения вершин после изменений, а не до.
Во втором примере корнем дерева является $$$2$$$, а начальные значения равны $$$[1, 1]$$$.
В последнем примере корнем дерева является $$$1$$$, а начальные значения равны $$$[-1, 1, 1, 1, 1, 1, -1]$$$.
Обратите внимание, что это всего лишь объяснение того, как работают запросы, и оно не должно использовать какую-либо конкретную стратегию для решения задачи.