Problem: This is an interactive problem. You have to use a flush operation right after printing each line. For example, in C++ you should use the function fflush(stdout), in Java — System.out.flush(), in Pascal — flush(output) and in Python — sys.stdout.flush().

Mr. Chanek wants to buy a flamingo to accompany his chickens on his farm. Before going to the pet shop, Mr. Chanek stops at an animal festival to have fun. It turns out there is a carnival game with a flamingo as the prize.

There are N mysterious cages, which are numbered from 1 to N. Cage i has A_i (0 ≤ A_i ≤ 10^3) flamingoes inside (1 ≤ i ≤ N). However, the game master keeps the number of flamingoes inside a secret. To win the flamingo, Mr. Chanek must guess the number of flamingoes in each cage.

Coincidentally, Mr. Chanek has N coins. Each coin can be used to ask once, what is the total number of flamingoes inside cages numbered L to R inclusive? With L < R.

Input

Use standard input to read the responses of your questions.

Initially, the judge will give an integer N (3 ≤ N ≤ 10^3), the number of cages, and the number of coins Mr. Chanek has.

For each of your questions, the jury will give an integer that denotes the number of flamingoes from cage L to R inclusive.

If your program does not guess the flamingoes or ask other questions, you will get "Wrong Answer". Of course, if your program asks more questions than the allowed number, your program will get "Wrong Answer".

Output

To ask questions, your program must use standard output.

Then, you can ask at most N questions. Questions are asked in the format "? L R", (1 ≤ L < R ≤ N). 

To guess the flamingoes, print a line that starts with "!" followed by N integers where the i-th integer denotes the number of flamingo in cage i. After answering, your program must terminate or will receive the "idle limit exceeded" verdict. You can only guess the flamingoes once.

Examples

Input

6
 
5
 
15
 
10
 

Output

 
? 1 2
 
? 5 6
 
? 3 4
 
! 1 4 4 6 7 8

Note

In the sample input, the correct flamingoes amount is [1, 4, 4, 6, 7, 8].

Solution (in JAVA):

Solution:
//package  com.company;
//Some of the methods are copied from GeeksforGeeks Website
import java.util.*;
import java.lang.*;
import java.io.*;
public class Main
{
    static  Reader sc=new Reader();
    // static FastReader sc=new FastReader(System.in);

    public static void main (String[] args) throws java.lang.Exception
    {
        try{
	    /*
	        int n=sc.nextInt();
	        ArrayList<Integer> al=new ArrayList<>();
	        ArrayList<Long> al=new ArrayList<>();
	        Set<Integer> set=new HashSet<>();
	        Collections.sort(al,Collections.reverseOrder());

	        long n=sc.nextLong();
	        for(int i=0;i<n;i++)
	        String s=sc.next();
	        StringBuilder sb=new StringBuilder();
	     */
            int t =1;// sc.nextInt();
            while(t-->0)
            {
                int n=sc.nextInt();

                int a[]=new int[n];
                int x,y,z=0;
                int x_plus_y=0,y_plus_z=0,x_plus_z=0;

                out.println("? 1 2");
                out.flush();
                x_plus_y=sc.nextInt();

                out.println("? 2 3");
                out.flush();
                y_plus_z=sc.nextInt();

                out.println("? 1 3");
                out.flush();
                int x_plus_y_plus_z=sc.nextInt();



                x=x_plus_y_plus_z- y_plus_z;
                y=x_plus_y-x;
                z=y_plus_z-y;

                a[0]=x;
                a[1]=y;
                a[2]=z;
                for(int i=3;i<n;i++)
                {
                    out.println("? "+(i)+" "+(i+1));
                    out.flush();
                    int sum=sc.nextInt();
                    a[i]=sum-a[i-1];
                }

                out.print("! ");
                for(int e : a)
                    out.print(e+" ");
            }
            out.flush();
            out.close();
        }
        catch(Exception e)
        {}
    }

 /*
   ...SOLUTION ENDS HERE...........SOLUTION ENDS HERE...
 */

    static void flag(boolean flag)
    {
        out.println(flag ? "YES" : "NO");
        out.flush();
    }

 /*
    Map<Long,Long> map=new HashMap<>();
             for(int i=0;i<n;i++)
               {
                  if(!map.containsKey(a[i]))
                   map.put(a[i],1);
                 else
                   map.replace(a[i],map.get(a[i])+1);
               }

    Set<Map.Entry<Long,Long>> hmap=map.entrySet();
             for(Map.Entry<Long,Long> data : hmap)
               {

               }

   Iterator<Integer> it = set.iterator();
          while(it.hasNext())
           {
            int x=it.next();
           }
   */

    static void print(int a[])
    {
        int n=a.length;
        for(int i=0;i<n;i++)
        {
            out.print(a[i]+" ");
        }
        out.println();
        out.flush();
    }
    static void print(long a[])
    {
        int n=a.length;
        for(int i=0;i<n;i++)
        {
            out.print(a[i]+" ");
        }
        out.println();
        out.flush();
    }
    static void print_int(ArrayList<Integer> al)
    {
        int si=al.size();
        for(int i=0;i<si;i++)
        {
            out.print(al.get(i)+" ");
        }
        out.println();
        out.flush();
    }
    static void print_long(ArrayList<Long> al)
    {
        int si=al.size();
        for(int i=0;i<si;i++)
        {
            out.print(al.get(i)+" ");
        }
        out.println();
        out.flush();
    }

    static int LowerBound(int a[], int x)
    { // x is the target value or key
        int l=-1,r=a.length;
        while(l+1<r) {
            int m=(l+r)>>>1;
            if(a[m]>=x) r=m;
            else l=m;
        }
        return r;
    }

    static int UpperBound(int a[], int x)
    {// x is the key or target value
        int l=-1,r=a.length;
        while(l+1<r) {
            int m=(l+r)>>>1;
            if(a[m]<=x) l=m;
            else r=m;
        }
        return l+1;
    }
    static class Graph
    {
        int v;
        ArrayList<Integer> list[];
        Graph(int v)
        {
            this.v=v;
            list=new ArrayList[v+1];
            for(int i=1;i<=v;i++)
                list[i]=new ArrayList<Integer>();
        }
        void addEdge(int a, int b)
        {
            this.list[a].add(b);
        }
    }
    static void DFS(Graph g, boolean[] visited, int u)
    {
        visited[u]=true;
        int v=0;
        for(int i=0;i<g.list[u].size();i++)
        {
            v=g.list[u].get(i);
            if(!visited[v])
                DFS(g,visited,v);
        }
    }

// static class Pair
//    {
//       int x,y;
//       Pair(int x,int y)
//        {
//           this.x=x;
//           this.y=y;
//        }
//    }

    static long sum_array(int a[])
    {
        int n=a.length;
        long sum=0;
        for(int i=0;i<n;i++)
            sum+=a[i];
        return sum;
    }
    static long sum_array(long a[])
    {
        int n=a.length;
        long sum=0;
        for(int i=0;i<n;i++)
            sum+=a[i];
        return sum;
    }

    static void sort(int[] a)
    {
        ArrayList<Integer> l=new ArrayList<>();
        for (int i:a) l.add(i);
        Collections.sort(l);
        for (int i=0; i<a.length; i++) a[i]=l.get(i);
    }
    static void sort(long[] a)
    {
        ArrayList<Long> l=new ArrayList<>();
        for (long i:a) l.add(i);
        Collections.sort(l);
        for (int i=0; i<a.length; i++) a[i]=l.get(i);
    }

    static void reverse_array(int a[])
    {
        int n=a.length;
        int i,t;
        for (i = 0; i < n / 2; i++) {
            t = a[i];
            a[i] = a[n - i - 1];
            a[n - i - 1] = t;
        }
    }
    static void reverse_array(long a[])
    {
        int n=a.length;
        int i; long t;
        for (i = 0; i < n / 2; i++) {
            t = a[i];
            a[i] = a[n - i - 1];
            a[n - i - 1] = t;
        }
    }
    static long modInverse(long a, long m)
    {
        long g = gcd(a, m);

        return   power(a, m - 2, m);

    }
    static long power(long x, long y, long m)
    {
        if (y == 0)
            return 1;
        long p = power(x, y / 2, m) % m;
        p = (int)((p * (long)p) % m);
        if (y % 2 == 0)
            return p;
        else
            return (int)((x * (long)p) % m);
    }
    static long gcd(long a, long b)
    {
        if (a == 0)
            return b;

        return gcd(b%a, a);
    }
    static int gcd(int a, int b)
    {
        if (a == 0)
            return b;

        return gcd(b%a, a);
    }

    static class FastReader{

        byte[] buf = new byte[2048];
        int index, total;
        InputStream in;

        FastReader(InputStream is) {
            in = is;
        }

        int scan() throws IOException {
            if (index >= total) {
                index = 0;
                total = in.read(buf);
                if (total <= 0) {
                    return -1;
                }
            }
            return buf[index++];
        }

        String next() throws IOException {
            int c;
            for (c = scan(); c <= 32; c = scan());
            StringBuilder sb = new StringBuilder();
            for (; c > 32; c = scan()) {
                sb.append((char) c);
            }
            return sb.toString();
        }

        int nextInt() throws IOException {
            int c, val = 0;
            for (c = scan(); c <= 32; c = scan());
            boolean neg = c == '-';
            if (c == '-' || c == '+') {
                c = scan();
            }
            for (; c >= '0' && c <= '9'; c = scan()) {
                val = (val << 3) + (val << 1) + (c & 15);
            }
            return neg ? -val : val;
        }

        long nextLong() throws IOException {
            int c;
            long val = 0;
            for (c = scan(); c <= 32; c = scan());
            boolean neg = c == '-';
            if (c == '-' || c == '+') {
                c = scan();
            }
            for (; c >= '0' && c <= '9'; c = scan()) {
                val = (val << 3) + (val << 1) + (c & 15);
            }
            return neg ? -val : val;
        }
    }

    static class Reader
    {
        final private int BUFFER_SIZE = 1 << 16;
        private DataInputStream din;
        private byte[] buffer;
        private int bufferPointer, bytesRead;

        public Reader()
        {
            din = new DataInputStream(System.in);
            buffer = new byte[BUFFER_SIZE];
            bufferPointer = bytesRead = 0;
        }

        public Reader(String file_name) throws IOException
        {
            din = new DataInputStream(new FileInputStream(file_name));
            buffer = new byte[BUFFER_SIZE];
            bufferPointer = bytesRead = 0;
        }

        public String readLine() throws IOException
        {
            byte[] buf = new byte[64]; // line length
            int cnt = 0, c;
            while ((c = read()) != -1)
            {
                if (c == '\n')
                    break;
                buf[cnt++] = (byte) c;
            }
            return new String(buf, 0, cnt);
        }

        public int nextInt() throws IOException
        {
            int ret = 0;
            byte c = read();
            while (c <= ' ')
                c = read();
            boolean neg = (c == '-');
            if (neg)
                c = read();
            do
            {
                ret = ret * 10 + c - '0';
            }  while ((c = read()) >= '0' && c <= '9');

            if (neg)
                return -ret;
            return ret;
        }

        public long nextLong() throws IOException
        {
            long ret = 0;
            byte c = read();
            while (c <= ' ')
                c = read();
            boolean neg = (c == '-');
            if (neg)
                c = read();
            do {
                ret = ret * 10 + c - '0';
            }
            while ((c = read()) >= '0' && c <= '9');
            if (neg)
                return -ret;
            return ret;
        }

        public double nextDouble() throws IOException
        {
            double ret = 0, div = 1;
            byte c = read();
            while (c <= ' ')
                c = read();
            boolean neg = (c == '-');
            if (neg)
                c = read();

            do {
                ret = ret * 10 + c - '0';
            }
            while ((c = read()) >= '0' && c <= '9');

            if (c == '.')
            {
                while ((c = read()) >= '0' && c <= '9')
                {
                    ret += (c - '0') / (div *= 10);
                }
            }

            if (neg)
                return -ret;
            return ret;
        }

        private void fillBuffer() throws IOException
        {
            bytesRead = din.read(buffer, bufferPointer = 0, BUFFER_SIZE);
            if (bytesRead == -1)
                buffer[0] = -1;
        }

        private byte read() throws IOException
        {
            if (bufferPointer == bytesRead)
                fillBuffer();
            return buffer[bufferPointer++];
        }

        public void close() throws IOException
        {
            if (din == null)
                return;
            din.close();
        }
    }
    static  PrintWriter out=new PrintWriter(System.out);
    static int int_max=Integer.MAX_VALUE;
    static int int_min=Integer.MIN_VALUE;
    static long long_max=Long.MAX_VALUE;
    static long long_min=Long.MIN_VALUE;
}
// Thank You !