#include #include #include #include #include #include #include using ll = long long int; const int INF = (1<<30); const ll INFLL = (1ll<<60); const ll MOD = (ll)(1e9+7); #define l_ength size void mul_mod(ll& a, ll b){ a *= b; a %= MOD; } void add_mod(ll& a, ll b){ a = (a, int > dic; std::vector v(100); int ans[2525],s[2525],t[2525],x,y,n; bool used[55][55]; bool check(int p, int q){ return (1<=x-p && x-p > n; m = n*n-n; for(x=1; x> s[i] >> t[i]; ++v[s[i]+50]; ++v[t[i]+50]; } ans[1] = dic[v]; x = ans[1]/n; y = ans[1]%n; z = 1; used[x][y] = true; for(i=2; i<=m; ++i){ if(s[i] == std::min(x-1,y) && t[i] == std::max(x-1,y)){ z = i; } } for(i=2; i<=m; ++i){ if(s[i] == t[i]){ used[x-s[i]][y-t[i]] = true; ans[i] = (x-s[i])*n+(y-t[i]); continue; } if(!check(s[i],t[i])){ used[x-t[i]][y-s[i]] = true; ans[i] = (x-t[i])*n+(y-s[i]); continue; } if(!check(t[i],s[i])){ used[x-s[i]][y-t[i]] = true; ans[i] = (x-s[i])*n+(y-t[i]); continue; } std::cout << "? " << i << " " << z << std::endl; std::cin >> p >> q; ++p; if(s[i] == std::min(x-p,y-q) && t[i] == std::max(x-p,y-q)){ used[p][q] = true; ans[i] = p*n+q; continue; } --p; std::swap(p,q); ++p; if(s[i] == std::min(x-p,y-q) && t[i] == std::max(x-p,y-q)){ used[p][q] = true; ans[i] = p*n+q; continue; } --p; } std::cout << "!"; for(i=1; i<=m; ++i){ std::cout << " " << ans[i]; } std::cout << std::endl; return 0; }