#include using namespace std; #define ll long long const ll maxn=10005; const ll inf=1e18; ll t,n,ans[maxn+5],vis[maxn+5],val[maxn+5]; ll q1[maxn+5],q2[maxn+5],pm[maxn+5],rv[maxn+5]; vector> p[maxn+5]; ll ask(ll i,ll j){ ll ret; printf("? %lld %lld\n",i,j); fflush(stdout); scanf("%lld",&ret); return ret; } void ans_out(){ ll i; printf("! "); for(i=1;i<=n;i++){ printf("%lld%c",ans[i],i==n?'\n':' '); } fflush(stdout); } void bfs(ll st){ ll i,u,v,w; queue q; for(i=1;i<=n;i++) vis[i]=0; vis[st]=1; val[st]=0; q.push(st); while(not q.empty()){ u=q.front(); q.pop(); for(i=0;imx) mx=val[i]; } lambda=(n-1)/(mx-mn); mu=1-mn*lambda; ok=1; for(i=1;i<=n;i++){ ans[i]=mu+val[i]*lambda; if(ans[i]<1 or ans[i]>n) ok=0; rv[ans[i]]=i; } if(ok){ cand=-1; for(i=2;i<=n;i++){ if(q1[i]!=-1){ if(ans[1]+ans[i]!=ans[q1[i]]) ok=0; else cand=i; } else{ if(ans[1]+ans[i]<=n) ok=0; } } if(cand==-1 and ok){ res=ask(1,2); if(res!=-1){ if(ans[1]+ans[2]!=ans[res]) ok=0; } else{ if(ans[1]+ans[2]<=n) ok=0; } } } if(not ok){ lambda=-lambda; mu=1-mx*lambda; for(i=1;i<=n;i++) ans[i]=mu+val[i]*lambda; } ans_out(); } return 0; }