func_code_string: #include <bits/stdc++.h>   using namespace std;   using ll = long long;   using lll = __int128_t;   const int N = 105;   int n;   vector<int> v[N];   void del(int x, int y) {     v[x].erase(find(v[x].begin(), v[x].end(), y));     v[y].erase(find(v[y].begin(), v[y].end(), x));   }   int f[N], rk[N];   lll dfs(int pos, int fa) {     f[pos] = fa;     vector<lll> vv;     for (auto &i : v[pos])       if (i != fa) vv.push_back(dfs(i, pos));     if (vv.empty()) return 0;     vector<int> ee(vv.size());     auto chk = [&](lll x) {       auto val = vv;       int mxid = -1;       lll mx;       for (int i = N - 1; i >= 0; --i)         if ((x >> i) & 1) {           mx = -(lll(1) << N);           for (int j = 0; j < int(vv.size()); j++)             if (val[j] > mx) mx = val[j], mxid = j;           ee[mxid] = i;           val[mxid] -= lll(1) << i;         }       for (int j = 0; j < int(vv.size()); j++)         if (val[j] >= 0) return 0;       return 1;     };     lll tt = (lll(1) << N) - 1;     for (int i = N - 1; i >= 0; --i)       if (chk(tt - (lll(1) << i))) tt -= lll(1) << i;     assert(chk(tt));     int idx = 0;     for (auto &i : v[pos])       if (i != fa) rk[i] = ee[idx++];     lll ret = 0;     for (int i = 0; i < int(vv.size()); i++)       ret |= vv[i] & (~((lll(1) << ee[i]) - 1)) | lll(1) << ee[i];     return ret;   }   int xx;   inline void upd(int x, int y) {     if (f[x] == y) swap(x, y);     if (!xx || rk[y] > rk[xx]) xx = y;   }   void gete(int pos, int fa) {     for (auto &i : v[pos])       if (i != fa) gete(i, pos), upd(pos, i);   }   int main() {     ios::sync_with_stdio(false);     cin >> n;     int t1, t2;     for (int i = 1; i < n; i++)       cin >> t1 >> t2, v[t1].push_back(t2), v[t2].push_back(t1);     dfs(1, 0);     int x = 1;     while (!v[x].empty()) {       xx = 0;       gete(x, 0);       del(xx, f[xx]);       cout <<  ?   << xx <<     << f[xx] << endl;       cin >> x;     }     cout <<  !   << x << endl;     return 0;   }   