import sys def query(i,j): print("?",i+1,j+1) sys.stdout.flush() p,q = map(int,input().split()) return (p,q) N = int(input()) if N==2: p,q = query(1,0) if (p,q)==(0,1): print("!",2,3) else: print("!",3,2) exit() answer = [-1 for i in range(N**2-N)] mod = 998244353 B = [1] for i in [0]*100: B.append((B[-1]*1001)%mod) S = [0 for i in range(N**2-N)] for i in range(N,N**2): for j in range(N,N**2): p = (j//N)-(i//N) q = (j%N)-(i%N) if p>q: p,q = q,p S[i-N] += B[p+N] + B[q+N] S[i-N] %= mod all_query = [-1 for i in range(N**2-N)] s = 0 for i in range(N**2-N): p,q = query(i,0) all_query[i] = (p,q) s += B[p+N] + B[q+N] s %= mod for i in range(N**2-N): if s==S[i]: answer[0] = i + N break dic = {} #print(answer[0]) for i in range(N,N**2): j = answer[0] p = (i//N)-(j//N) q = (i%N)-(j%N) if p>q: p,q = q,p if (p,q) not in dic: dic[p,q] = [] dic[p,q].append(i) #print(dic) base = -1 base_idx = -1 i,j = 2*N-1,answer[0] p = (i//N)-(j//N) q = (i%N)-(j%N) if p>q: p,q = q,p if len(dic[p,q])==1: base = 2*N-1 for i in range(N**2-N): if (p,q)==all_query[i]: base_idx = i break else: i,j = N**2-N,answer[0] p = (i//N)-(j//N) q = (i%N)-(j%N) if p>q: p,q = q,p base = N**2-N for i in range(N**2-N): if (p,q)==all_query[i]: base_idx = i break #print(base,base_idx) base_dic = {} j = base for i in range(N,N**2): p = (i//N)-(j//N) q = (i%N)-(j%N) if p>q: p,q = q,p base_dic[p,q] = i for i in range(N**2-N): p,q = all_query[i] if len(dic[p,q])==1: answer[i] = dic[p,q][0] else: P,Q = query(i,base_idx) answer[i] = base_dic[P,Q] dic[p,q].remove(answer[i]) print("!",*answer)