func_code_string: #include <bits/stdc++.h>   using namespace std;   int Ask(int x, int y) {     printf( ? %d %d n , x, y);     fflush(stdout);     int t;     scanf( %d , &t);     return t;   }   int vis[105], t[105], n;   struct bt {     bitset<105> A;     int id;     int operator[](int x) { return A[x]; }     friend bool operator<(bt x, bt y) {       for (int i = n; ~i; i--)         if (x[i] ^ y[i]) return x[i] < y[i];       return 0;     }     int mx() {       for (int i = n; ~i; i--)         if (A[i]) return i;       return -1;     }   } dp[105];   map<pair<int, int>, int> val;   priority_queue<bt> q;   vector<int> e[105];   bool chk(vector<bt> f) {     for (auto x : f) q.push(x);     if (q.empty()) return 1;     for (int i = n; ~i; i--)       if (t[i]) {         bt x = q.top();         q.pop();         int v = x.mx();         if (v > i)           break;         else if (v == i)           x.A[v] = 0, q.emplace(x);         if (!q.size()) return 1;       }     while (q.size()) q.pop();     return 0;   }   void produce(int u, vector<bt> f) {     for (auto x : f) q.push(x);     if (q.empty()) return;     for (int i = n; ~i; i--)       if (t[i]) {         bt x = q.top();         q.pop();         int v = x.mx();         if (v == i)           x.A[v] = 0, q.emplace(x);         else           val[pair<int, int>(x.id, u)] = val[pair<int, int>(u, x.id)] = i;         if (!q.size()) break;       }     while (q.size()) q.pop();   }   void dfs1(int u, int fa) {     vector<bt> g;     dp[u].id = u;     for (int v : e[u])       if (v != fa) dfs1(v, u), g.push_back(dp[v]);     fill(t, t + n, 1);     t[n] = 0;     for (int i = n; ~i; i--, t[i] = 0)       if (!chk(g)) t[i] = 1;     for (int i = 0; i <= n; i++) dp[u].A[i] = t[i];     produce(u, g);   }   pair<int, int> id;   void dfs2(int u, int fa, int &mx) {     for (int v : e[u])       if (!vis[v] && v != fa) {         int k = val[pair<int, int>(u, v)];         if (k > mx) mx = k, id = pair<int, int>(u, v);         dfs2(v, u, mx);       }   }   void solve(int u, int fa) {     int mx = -1;     dfs2(u, fa, mx);     if (mx == -1) printf( ! %d n , u), fflush(stdout), exit(0);     int res = Ask(id.first, id.second);     if (res == id.first)       vis[id.second] = 1, solve(id.first, id.second);     else       vis[id.first] = 1, solve(id.second, id.first);   }   int main() {     scanf( %d , &n);     for (int i = 1, u, v; i < n; i++)       scanf( %d%d , &u, &v), e[u].emplace_back(v), e[v].emplace_back(u);     dfs1(1, 0);     solve(1, 0);   }   