func_code_string: #include <bits/stdc++.h>   int height;   std::vector<int> graph[1 + 127];   bool mark[1 + 127];   int answer;   void setup(void) {     scanf( %d , &height);     for (int i = 1; i <= 127; i++) {       graph[i].clear();       mark[i] = false;     }     answer = 0;   }   void ask(int v) {     if (!graph[v].empty()) {       return;     }     printf( ? %d n , v);     fflush(stdout);     int k;     scanf( %d , &k);     if (k == 0) exit(0);     for (int i = 0; i < k; i++) {       int u;       scanf( %d , &u);       graph[v].push_back(u);     }     if (k == 2) answer = v;   }   void guess(int v) {     printf( ! %d n , v);     fflush(stdout);   }   int find_leaf(int v, std::list<int>& path, bool prepend) {     ask(v);     mark[v] = true;     if (graph[v].size() == 1) return v;     for (auto u : graph[v]) {       if (!mark[u]) {         if (prepend)           path.push_front(u);         else           path.push_back(u);         return find_leaf(u, path, prepend);       }     };     throw -1;   }   int following(int v) {     for (auto u : graph[v])       if (!mark[u]) return u;     return v;   }   bool reachable(int v, int parent, int depth) {     ask(v);     if (depth == 0) return true;     if (answer) {       return true;     }     for (auto u : graph[v]) {       if (u != parent) return reachable(u, v, depth - 1);     }     return false;   }   bool within(int v, int parent, int depth) {     ask(v);     if (answer) {       return true;     }     if (depth > 0) {       for (auto u : graph[v]) {         if (u != parent && within(u, v, depth - 1)) return true;       }     }     return false;   }   int main(void) {     int t;     scanf( %d , &t);     while (t--) {       setup();       if (height == 0) break;       std::list<int> path;       path.push_front(1);       find_leaf(1, path, true);       find_leaf(1, path, false);       int altitude = path.size() / 2 + 1;       int par = *std::next(path.begin(), altitude - 1);       int v = following(par);       altitude++;       for (; altitude < height && altitude < 5 && !answer; altitude++) {         ask(v);         int u, w;         if (graph[v][0] == par) {           u = graph[v][1];           w = graph[v][2];         } else if (graph[v][1] == par) {           u = graph[v][0];           w = graph[v][2];         } else {           u = graph[v][0];           w = graph[v][1];         }         int next;         if (reachable(u, v, altitude)) {           next = u;         } else {           next = w;         }         par = v;         v = next;       };       if (!answer) {         if (altitude == height + 1) {           answer = par;         } else if (altitude == height) {           answer = v;         } else {           ask(v);           std::vector<int> candidates;           if (altitude == height - 1) {             ;             for (auto u : graph[v]) {               if (u != par) candidates.push_back(u);             }           } else if (altitude == height - 2) {             ;             for (auto u : graph[v]) {               if (u != par) {                 ask(u);                 candidates.push_back(u);                 for (auto w : graph[u]) {                   if (w != v) candidates.push_back(w);                 }               }             }           } else {             ;             throw -1;           }           for (int i = 0; i < (int)candidates.size() - 1; i++) {             ask(candidates[i]);           }           if (!answer) {             answer = candidates[candidates.size() - 1];           }         }       }       guess(answer);     }     return 0;   }   