This is an interactive problem.

We hid from you a permutation p of length n, consisting of the elements from 1 to n. You want to guess it. To do that, you can give us 2 different indices i and j, and we will reply with p_{i} mod p_{j} (remainder of division p_{i} by p_{j}).

We have enough patience to answer at most 2 ⋅ n queries, so you should fit in this constraint. Can you do it?

As a reminder, a permutation of length n is an array consisting of n distinct integers from 1 to n in arbitrary order. For example, [2,3,1,5,4] is a permutation, but [1,2,2] is not a permutation (2 appears twice in the array) and [1,3,4] is also not a permutation (n=3 but there is 4 in the array).

Input

The only line of the input contains a single integer n (1 ≤ n ≤ 10^4) — length of the permutation.

Interaction

The interaction starts with reading n. 

Then you are allowed to make at most 2 ⋅ n queries in the following way: 

  * "? x y" (1 ≤ x, y ≤ n, x ≠ y). 



After each one, you should read an integer k, that equals p_x mod p_y. 

When you have guessed the permutation, print a single line "! " (without quotes), followed by array p and quit.

After printing a query do not forget to output end of line and flush the output. Otherwise, you will get Idleness limit exceeded. To do this, use:

  * fflush(stdout) or cout.flush() in C++;
  * System.out.flush() in Java;
  * flush(output) in Pascal;
  * stdout.flush() in Python;
  * see documentation for other languages.



Exit immediately after receiving "-1" and you will see Wrong answer verdict. Otherwise you can get an arbitrary verdict because your solution will continue to read from a closed stream.

Hack format

In the first line output n (1 ≤ n ≤ 10^4). In the second line print the permutation of n integers p_1, p_2, …, p_n.

Example

Input


3

1

2

1

0

Output


? 1 2

? 3 2

? 1 3

? 2 1

! 1 3 2
	import java.util.*;

	import java.io.*;
	import java.math.*;
	import java.awt.geom.*;
	 
	import static java.lang.Math.*;
	 
	 public class Solution implements Runnable {
		
		 long mod1=(long)1e9+7;
		 int mod2=998244353;
	     
		 public void solve() throws Exception {
//			 int t=sc.nextInt();
//			 while(t-->0)
//			 {
				 int n=sc.nextInt();
				 int arr[]=new int[n];
				 int brr[]=new int[n];
				 int first=1;
				 boolean done[]=new boolean[n+1];
				 for(int i=2;i<=n;i++)
				 {
					 System.out.println("?"+" "+first+" "+(i));
					 int a=sc.nextInt();
					 System.out.flush();
					 if(a==-1)
					 {
						 System.exit(0);
					 }
					 System.out.println("?"+" "+(i)+" "+first);
					 int b=sc.nextInt();
					 System.out.flush();
					 if(b==-1)
					 {
						 System.exit(0);
					 }
					 if(a>b)
					 {
						 brr[first-1]=a;
						 done[a]=true;
						 for(int j=1;j<=n;j++)
						 {
							 if(brr[j-1]==0)
							 {
								 first=j;
								 break;
							 }
						 }
					 }
					 else {
						 brr[i-1]=b;
						 done[b]=true;
					 }
					 //System.out.println(i);
					 
				 }
				 int val=0;
				 for(int i=1;i<=n;i++)
				 {
					 if(done[i]==false)
						val=i;
				 }
				 System.out.print("! ");
				 for(int i=0;i<n;i++)
				 {
					 if(brr[i]==0)
						 System.out.print(val+" ");
					 else
					 System.out.print(brr[i]+" ");
				 }
				 System.out.flush();
				 //System.exit(0);
			 
			 
		 }
		 
		 
		 
		 static long gcd(long a, long b) 
		    { 
		        if (a == 0) 
		            return b; 
		        return gcd(b % a, a); 
		    } 
		 
		 
		 
		 static long ncr(int n, int r, long p) 
		    { 
			 if(r>n)
				 return 0l;
		        if (r > n - r) 
		            r = n - r; 
		  
		        long C[] = new long[r + 1]; 
		  
		        C[0] = 1; 
		  
		        for (int i = 1; i <= n; i++) { 
		  
		            for (int j = Math.min(i, r); j > 0; j--) 
		                C[j] = (C[j] + C[j - 1]) % p; 
		        } 
		        return C[r]%p; 
		    } 
	    
	  public long power(long x, long y, long p) 
	    { 
	        long res = 1;      
	      // out.println(x+" "+y);
	        x = x % p;  
	       if (x == 0) return 0;    
	  
	        while (y > 0) 
	        { 
	            if((y & 1)==1) 
	                res = (res * x) % p; 
	            y = y >> 1;  
	            x = (x * x) % p;  
	        } 
	        return res; 
	    } 
	    
	    		
	    
	    
	    
	    
	    
	    static Throwable uncaught;
	 
	    BufferedReader in;
	    FastScanner sc;
	    PrintWriter out;
	 
	    @Override
	    public void run() {
	        try {
	            in = new BufferedReader(new InputStreamReader(System.in));
	            out = new PrintWriter(System.out);
	            sc = new FastScanner(in);
	            solve();
	        } catch (Throwable uncaught) {
	            Solution.uncaught = uncaught;
	        } finally {
	            out.close();
	        }
	    }
	 
	    public static void main(String[] args) throws Throwable {
	        Thread thread = new Thread(null, new Solution(), "", (1 << 26));
	        thread.start();
	        thread.join();
	        if (Solution.uncaught != null) {
	            throw Solution.uncaught;
	        }
	    }
	 
	}
	 
	class FastScanner {
	 
	    BufferedReader in;
	    StringTokenizer st;
	 
	    public FastScanner(BufferedReader in) {
	        this.in = in;
	    }
	 
	    public String nextToken() throws Exception {
	        while (st == null || !st.hasMoreTokens()) {
	            st = new StringTokenizer(in.readLine());
	        }
	        return st.nextToken();
	    }
	 
	    public int nextInt() throws Exception {
	        return Integer.parseInt(nextToken());
	    }
	    
	    public int[] readArray(int n) throws Exception {
			int[] a=new int[n];
			for (int i=0; i<n; i++) a[i]=nextInt();
			return a;
		}
	 
	    public long nextLong() throws Exception {
	        return Long.parseLong(nextToken());
	    }
	 
	    public double nextDouble() throws Exception {
	        return Double.parseDouble(nextToken());
	    }
	 
	}