func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 2007;   set<pair<int, int> > E[N];   struct edge {     int x, y;   } e[N];   int n, rk[N], mxrk, mxid;   void adde(int x, int y, int i) {     E[x].insert(make_pair(y, i)), E[y].insert(make_pair(x, i));   }   void dele(int i) {     int x = e[i].x, y = e[i].y;     E[x].erase(make_pair(y, i)), E[y].erase(make_pair(x, i));     printf( ? %d %d n , x, y), fflush(stdout);   }   bool check(vector<pair<__int128, int> > &ve, __int128 x) {     priority_queue<pair<__int128, int> > q;     for (auto u : ve) q.push(u);     for (int i = n - 1; i >= 0; i--)       if (x >> i & 1) {         pair<__int128, int> v = q.top();         q.pop();         v.first -= __int128(1) << i, rk[v.second] = i;         q.push(v);       }     return q.top().first < 0;   }   __int128 produce(vector<pair<__int128, int> > &ve) {     if (!ve.size()) return 0;     __int128 z = (__int128(1) << n) - 1;     for (int i = n - 1; i >= 0; i--)       if (check(ve, z - (__int128(1) << i))) z -= __int128(1) << i;     check(ve, z);     return z;   }   __int128 dfs(int v, int fa) {     vector<pair<__int128, int> > ve;     for (auto x : E[v]) {       int u = x.first;       if (u == fa) continue;       ve.push_back(make_pair(dfs(u, v), x.second));     }     return produce(ve);   }   void find(int v, int fa) {     for (auto x : E[v]) {       int u = x.first, i = x.second;       if (u == fa) continue;       if (rk[i] > mxrk) mxrk = rk[i], mxid = i;       find(u, v);     }   }   int main() {     scanf( %d , &n);     for (int i = 1; i < n; i++) {       int x, y;       scanf( %d%d , &x, &y);       adde(x, y, i), adde(y, x, i);       e[i] = {x, y};     }     dfs(1, 0);     int rt = 1;     while (1) {       mxrk = -1, mxid = 0;       find(rt, 0);       if (mxrk == -1) break;       dele(mxid);       scanf( %d , &rt);     }     printf( ! %d n , rt), fflush(stdout);     return 0;   }   