Ceci est un problème interactif.
Little Cyan Fish possède un graphe non orienté simple caché comportant $n$ sommets, numérotés de $1$ à $n$. Vous connaissez la valeur de $n$, mais vous ne connaissez aucune des arêtes. Little Cyan Fish adore le concept de coupe (cut). Pour un ensemble de sommets $S$, soit $\operatorname{cut}(S)$ le nombre d'arêtes ayant exactement une extrémité dans $S$.
Little Cyan Fish vous permet de comparer des coupes en effectuant des requêtes. Lors d'une requête, vous choisissez deux ensembles de sommets $S_1$ et $S_2$. Little Cyan Fish vous indique si $\operatorname{cut}(S_1)$ est strictement inférieur, égal ou strictement supérieur à $\operatorname{cut}(S_2)$.
Vous pouvez probablement deviner que la suite parlera de reconstruire le graphe, mais cette fois-ci la tâche est plus simple. Little Cyan Fish vous donne un sommet $u$, et il veut que vous trouviez tous les sommets adjacents à $u$ en au plus $n + 10$ requêtes.
Entrée
La première ligne de l'entrée contient deux entiers $n$ et $u$ ($1 \le n \le 1000$, $1 \le u \le n$), indiquant respectivement le nombre de sommets et le sommet donné. Ensuite, l'interaction commence.
Interaction
Pour effectuer une requête, affichez une ligne au format suivant :
$$?\ s_1\ s_2$$
où $s_1$ et $s_2$ sont des chaînes de caractères de longueur $n$, composées uniquement des caractères 0 et 1. Pour chaque $j \in \{1, 2\}$, le sommet $i$ appartient à $S_j$ si et seulement si le $i$-ème caractère de $s_j$ est 1. Les ensembles peuvent être vides, peuvent se chevaucher et peuvent être égaux.
En réponse à la requête, vous recevrez un seul caractère <, =, ou >, signifiant que $\operatorname{cut}(S_1)$ est respectivement strictement inférieur, égal ou strictement supérieur à $\operatorname{cut}(S_2)$. Vous devez vous assurer que le nombre de requêtes que vous effectuez ne dépasse pas $n + 10$.
Pour rapporter la réponse, affichez une ligne au format suivant :
$$!\ k\ v_1\ v_2\ \dots\ v_k$$
où $k$ ($0 \le k \le n - 1$) est le nombre de sommets adjacents à $u$, et $v_1, v_2, \ldots, v_k$ sont leurs numéros distincts dans n'importe quel ordre. Si $k = 0$, affichez ! 0. Rapporter la réponse ne compte pas comme une requête. Votre programme doit se terminer immédiatement après avoir rapporté la réponse.
Après avoir affiché une requête ou rapporté la réponse, n'oubliez pas d'afficher un caractère de retour à la ligne et de vider le tampon de sortie (flush). Si vous effectuez une requête invalide ou dépassez la limite de requêtes, l'interacteur fermera le flux d'entrée et votre programme devra se terminer.
Dans ce problème, l'interacteur est adaptatif. Cela signifie que le graphe peut changer en fonction de vos requêtes, tant qu'il ne contredit aucune réponse précédente. Votre réponse doit être correcte pour tout graphe cohérent avec toutes les réponses que vous avez reçues.
Exemples
Entrée 1
4 1 < = < =
Sortie 1
? 0000 1000 ? 0100 1100 ? 0010 1010 ? 0001 1001 ! 2 2 4
Remarque
Un graphe cohérent avec l'interaction de l'exemple possède les arêtes $(1, 2)$, $(1, 4)$ et $(2, 3)$.
Outil de test : Un outil de test est fourni pour aider les participants à développer et tester leurs solutions. Vous pouvez télécharger cet outil depuis les pièces jointes. Exécutez l'outil avec l'option -h pour afficher les instructions d'utilisation. L'outil vérifie l'interaction et la réponse rapportée, mais n'impose pas les limites de temps ou de mémoire.
L'outil de test utilise un graphe fixe spécifié dans son fichier d'entrée tout au long de l'interaction, tandis que l'interacteur officiel est adaptatif. Réussir les tests avec l'outil de test ne garantit pas que votre solution soit correcte face à l'interacteur officiel.