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 CPP):

Solution:
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimization("unroll-loops")
using namespace std;
void __print(int x) { cerr << x; }
void __print(long x) { cerr << x; }
void __print(long long x) { cerr << x; }
void __print(unsigned x) { cerr << x; }
void __print(unsigned long x) { cerr << x; }
void __print(unsigned long long x) { cerr << x; }
void __print(float x) { cerr << x; }
void __print(double x) { cerr << x; }
void __print(long double x) { cerr << x; }
void __print(char x) { cerr << '\'' << x << '\''; }
void __print(const char *x) { cerr << '\"' << x << '\"'; }
void __print(const string &x) { cerr << '\"' << x << '\"'; }
void __print(bool x) { cerr << (x ? "true" : "false"); }
template <typename T, typename V>
void __print(const pair<T, V> &x) {
  cerr << '{';
  __print(x.first);
  cerr << ',';
  __print(x.second);
  cerr << '}';
}
template <typename T>
void __print(const T &x) {
  int f = 0;
  cerr << '{';
  for (auto &i : x) cerr << (f++ ? "," : ""), __print(i);
  cerr << "}";
}
void _print() { cerr << "]\n"; }
template <typename T, typename... V>
void _print(T t, V... v) {
  __print(t);
  if (sizeof...(v)) cerr << ", ";
  _print(v...);
}
long long gcd(long long a, long long b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
long long fpow(long long a, long long b, long long M) {
  a %= M;
  long long res = 1;
  while (b > 0) {
    if (b & 1) {
      res = res * a % M;
    }
    a = a * a % M;
    b >>= 1;
  }
  return res;
}
const long long MAXN = 1000000 + 5;
long long spf[MAXN];
void sieve() {
  spf[1] = 1;
  for (long long i = 2; i < MAXN; i++) spf[i] = i;
  for (long long i = 4; i < MAXN; i += 2) spf[i] = 2;
  for (long long i = 3; i * i < MAXN; i++) {
    if (spf[i] == i) {
      for (long long j = i * i; j < MAXN; j += i)
        if (spf[j] == j) spf[j] = i;
    }
  }
}
map<long long, long long> getFactorization(long long x) {
  map<long long, long long> ret;
  while (x != 1) {
    ret[spf[x]]++;
    x = x / spf[x];
  }
  return ret;
}
long long mod = 1000000007;
long long binomialCoeff(long long n, long long k) {
  long long res = 1;
  if (k > n - k) k = n - k;
  for (long long i = 0; i < k; ++i) {
    res *= (n - i);
    res /= (i + 1);
  }
  return res;
}
struct dsu {
  vector<long long> parent;
  void init(long long n) { parent.assign(n, 0); }
  void make_set(long long v) { parent[v] = v; }
  long long find_set(long long v) {
    if (v == parent[v]) return v;
    return parent[v] = find_set(parent[v]);
  }
  void union_sets(long long a, long long b) {
    a = find_set(a);
    b = find_set(b);
    if (a != b) {
      if (a < b)
        parent[b] = a;
      else
        parent[a] = b;
    }
  }
};
struct item {
  long long e;
};
struct segtree {
  long long size;
  vector<item> values;
  item NEUTRAL_ELEMENT = {0};
  item single(item v) { return v; }
  item merge(item a, item b) { return {a.e + b.e}; }
  void init(long long n) {
    size = 1;
    while (size <= n) size *= 2;
    values.assign(size * 2, NEUTRAL_ELEMENT);
  }
  void set(long long i, item v, long long x, long long lx, long long rx) {
    if (rx - lx == 1) {
      values[x] = single(v);
      return;
    }
    long long m = (lx + rx) / 2;
    if (i < m) {
      set(i, v, 2 * x + 1, lx, m);
    } else {
      set(i, v, 2 * x + 2, m, rx);
    }
    values[x] = merge(values[2 * x + 1], values[2 * x + 2]);
  }
  void set(long long i, item v) { set(i, v, 0, 0, size); }
  item calculate(long long l, long long r, long long x, long long lx,
                 long long rx) {
    if (lx >= r || l >= rx) return NEUTRAL_ELEMENT;
    if (lx >= l && rx <= r) return values[x];
    long long m = (lx + rx) / 2;
    item s1 = calculate(l, r, 2 * x + 1, lx, m);
    item s2 = calculate(l, r, 2 * x + 2, m, rx);
    return merge(s1, s2);
  }
  item calculate(long long l, long long r) {
    return calculate(l, r, 0, 0, size);
  }
};
void solve() {
  long long n;
  cin >> n;
  vector<long long> arr(n);
  vector<long long> dp(n);
  for (long long i = 1; i < n; i++) {
    cout << "? " << 1 << " " << i + 1 << endl;
    cin >> dp[i];
  }
  long long s;
  cout << "? " << 2 << " " << n << endl;
  cin >> s;
  arr[0] = dp[n - 1] - s;
  dp[0] = arr[0];
  for (long long i = 1; i < n; i++) {
    arr[i] = dp[i] - dp[i - 1];
  }
  cout << "!"
       << " ";
  for (long long i = 0; i < n; i++) cout << arr[i] << " ";
  cout << endl;
}
int main() {
  cout << fixed << setprecision(25);
  cerr << fixed << setprecision(10);
  srand((unsigned)time(NULL));
  auto start = std::chrono::high_resolution_clock::now();
  int t = 1;
  while (t--) {
    solve();
  }
  auto stop = std::chrono::high_resolution_clock::now();
  auto duration =
      std::chrono::duration_cast<std::chrono::nanoseconds>(stop - start);
  cerr << "Time taken : "
       << ((long double)duration.count()) / ((long double)1e9) << "s " << endl;
  return 0;
}