#include <bits/stdc++.h>
struct MI {
 private:
  char bb[1 << 14];
  FILE* f;
  char *bs, *be;
  char e;
  bool o, l;

 public:
  inline char get() {
    if (o) {
      o = 0;
      return e;
    }
    if (bs == be) be = (bs = bb) + fread(bb, 1, sizeof(bb), f);
    if (bs == be) {
      l = 1;
      return -1;
    };
    return *bs++;
  }
  inline void unget(char c) {
    o = 1;
    e = c;
  }
  template <class T>
  inline MI& operator>(T&);
};
template <class T>
struct Q {
  const static bool U = T(-1) >= T(0);
};
template <>
struct Q<char> {};
template <class T>
std::ostream& operator<(std::ostream& out, const T& t) {
  return out << t;
}
using std::cout;
const int $n = 105;
int n, v[$n];
struct movement {
  long long a, b;
} w[$n], d[$n];
inline int get(long long d) {
  if (!d) return 2;
  int l = 3, r = n + 2;
  while (l <= r) {
    const auto mid = (l + r) >> 1;
    const auto val = (long long)(mid - 2) * (mid - 1) / 2;
    if (val == d) return mid;
    if (val > d)
      r = mid - 1;
    else
      l = mid + 1;
  }
  assert(0);
}
int main() {
  std::cin >> n;
  std::cin >> w[0].a >> w[0].b;
  for (auto __r = (n - 1), i = (1); i <= __r; ++i) {
    cout < "+ " < i < ('\n');
    cout.flush();
    std::cin >> w[i].a >> w[i].b;
  }
  cout < "+ 1\n";
  cout.flush();
  std::cin >> w[n].a >> w[n].b;
  for (auto __r = (n), i = ((decltype(n))1); i <= __r; ++i)
    d[i] = {w[i].a - w[i - 1].a, w[i].b - w[i - 1].b};
  if (!d[1].a) {
    assert(d[n].a <= 1);
    v[1] = d[n].a;
  } else
    v[1] = get(d[n].a) - 2;
  v[3] = d[2].b ? get(d[3].a) - 1 : 0;
  v[2] = d[n].b / (v[3] + 1) - 1;
  for (auto __r = (n - 1), i = (4); i <= __r; ++i) {
    if (d[i - 1].b == (long long)(v[i - 3] + 1) * (v[i - 2] + 1))
      v[i] = 0;
    else
      v[i] = get(d[i].a) - 1;
  }
  v[n] = (d[n - 1].b - (long long)(v[n - 3] + 1) * (v[n - 2] + 1)) /
         (v[n - 2] + 1);
  cout < "! ";
  for (auto __r = (n), i = ((decltype(n))1); i <= __r; ++i)
    cout < v[i] < " \n"[i == n];
  cout.flush();
}
