#include <bits/stdc++.h>

using namespace std;

#define all(v) (v).begin(), (v).end()
#define sz(v) (int)(v).size()

typedef long long ll;
typedef pair<int, int> pii;

int main()
{

#ifndef ONLINE_JUDGE
    //freopen("input.txt", "r", stdin);
#endif

    int n;
    scanf("%d", &n);
    vector<int> ans(n + 1, -1), c(n + 1);

    int E, S, prevE, prevS;
    scanf("%d %d", &E, &S);

    auto ask = [&](int x) {
        printf("+ %d\n", x);
        fflush(stdout);
        prevE = E;
        prevS = S;
        scanf("%d %d", &E, &S);
    };
    auto dE = [&]() {
        return E - prevE;
    };
    auto dS = [&]() {
        return S - prevS;
    };

    auto revC = [&](int Cn2) {
        int x = 1;
        while(x * (x - 1) / 2 != Cn2) ++x;
        return x;
    };

    ask(1);
    int ab = dS();
    ask(2);
    if (dS() == 0)
        ans[3] = 0;
    ask(3);
    if (ans[3] == -1)
        ans[3] = revC(dE());
    int mem = dS();
    ask(1);
    ans[2] = dS() - ab - ans[3] - 1;
    c[2] = ans[2] + 1;
    ans[1] = revC(dE()) - 1;
    c[1] = ans[1] + 2;
    c[3] = ans[3] + 1;

    /*
    printf("%d %d %d\n", ans[1], ans[2], ans[3]);
    printf("\n");
    printf("%d %d %d\n", c[1], c[2], c[3]);
    printf("\n");
    */

    if (mem - (ans[1] + 1) * (ans[2] + 1) == 0)
        ans[4] = 0;

    for (int i = 4; i < n; ++i) {
        ask(i);
        if (ans[i] == -1)
            ans[i] = revC(dE());
        if (dS() - c[i - 2] * c[i - 1] == 0)
            ans[i + 1] = 0;

        c[i] = ans[i] + 1;
    }

    /*
    for (int i = 1; i < n; ++i)
        printf("%d ", c[i]);
    printf("\n");
    */

    if (ans[n] == -1) {
        int curS = 0;
        for (int i = 2; i < n; ++i)
            curS += c[i - 2] * c[i - 1] * c[i];
        ans[n] = (S - curS) / (c[n - 2] * c[n - 1]);
    }

    printf("! ");
    for (int i = 1; i <= n; ++i)
        printf("%d ", ans[i]);

}


#include <bits/stdc++.h>

using namespace std;

#define fst first
#define snd second
#define mp make_pair
#define debug(...) fprintf(stderr, __VA_ARGS__)

typedef long long LL;
typedef long double LD;
typedef pair<int, int> pii;

template<typename T> inline LL squ(T x) { return (LL) x * x; }
template<typename T> inline bool chkmax(T &a, const T &b) { return a < b ? a = b, 1 : 0; }
template<typename T> inline bool chkmin(T &a, const T &b) { return a > b ? a = b, 1 : 0; }

template<typename T> inline T read()
{
	T sum = 0, fg = 1; char c = getchar();
	for (; !isdigit(c); c = getchar()) if (c == '-') fg = -1;
	for (; isdigit(c); c = getchar()) sum = (sum << 3) + (sum << 1) + (c ^ 0x30);
	return fg * sum;
}

const int maxn = 100 + 10;

int n, a[maxn], c[maxn], F[maxn], G[maxn];

inline int query(int x)
{
	printf("+ %d\n", x), fflush(stdout);
}

int main()
{
#ifdef xunzhen
	freopen("F.in", "r", stdin);
	freopen("F.out", "w", stdout);
#endif

	n = read<int>(), F[n] = read<int>(), G[n] = read<int>();
	for (int i = n - 1; ~i; i--)
	{
		query(i > 2 ? i : (i & 1) + 1);
		F[i] = read<int>(), G[i] = read<int>();
	}
	for (int i = 1; i < n; i++) F[i - 1] -= F[i], G[i - 1] -= G[i];

	a[1] = sqrt(F[0] * 2);
	a[3] = G[0] - G[2] - 1;
	a[2] = G[2] / (a[3] + 1);

	c[1] = a[1] + 2, c[2] = a[2] + 1, c[3] = a[3] + 1;
	for (int i = 2; i <= n - 2; i++)
	{
		if (i >= 3) c[i + 2] = (G[i] - a[i - 2] * a[i - 1] - a[i - 1] * c[i + 1]) / c[i + 1], a[i + 2] = c[i + 2] - ((i + 2) < n ? 1 : 0);
		else c[i + 2] = (G[i - 1] - a[i - 2] * (a[i - 1] + 1) - (a[i - 1] + 1) * c[i + 1]) / c[i + 1], a[i + 2] = c[i + 2] - ((i + 2) < n ? 1 : 0);
	}

	printf("!");
	for (int i = 1; i <= n; i++) printf(" %d", a[i]);
	printf("\n");

	return 0;
}


#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <cctype>

#include <algorithm>
#include <random>
#include <bitset>
#include <queue>
#include <functional>
#include <set>
#include <map>
#include <vector>
#include <chrono>
#include <iostream>
#include <limits>
#include <numeric>

#define LOG(FMT...) fprintf(stderr, FMT)

using namespace std;

typedef long long ll;
typedef unsigned long long ull;

// mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

template<class T>
istream &operator>>(istream &is, vector<T> &v) {
  for (T &x : v)
    is >> x;
  return is;
}

template<class T>
ostream &operator<<(ostream &os, const vector<T> &v) {
  if (!v.empty()) {
    os << v.front();
    for (int i = 1; i < v.size(); ++i)
      os << ' ' << v[i];
  }
  return os;
}

int main() {

  int n;
  vector<pair<int, int>> res(1);
  cin >> n >> res[0].first >> res[0].second;

  auto ins = [&](int x) {
    cout << "+ " << x << endl;
    int rtrip, rstra;
    cin >> rtrip >> rstra;
    return make_pair(rtrip, rstra);
  };

  map<int, int> mp;
  for (int i = 1; i <= n * 2; ++i) mp[i * (i - 1) / 2] = i;

  for (int i = n; i > 3; --i) res.push_back(ins(i - 1));
  res.push_back(ins(1));
  res.push_back(ins(2));
  res.push_back(ins(1));

  for (int i = n; i; --i) {
    res[i].first -= res[i - 1].first;
    res[i].second -= res[i - 1].second;
  }

  vector<int> ans(n + 1);
  ans[1] = mp[res[n].first] - 1;
  if (res[n - 2].second)
    ans[2] = mp[res[n - 1].first];
  ans[3] = res[n].second / (ans[2] + 1) - 1;
  ans[4] = res[n - 1].second / (ans[3] + 1) - (ans[1] + 1) - 1;
  for (int i = 4; i < n; ++i)
    ans[i + 1] = (res[n - i + 1].second - ans[i - 2] * ans[i - 3]) / (ans[i] + 1) - ans[i - 2] - 1;
  ++ans[n];

  ans.erase(ans.begin(), ans.begin() + 1);
  cout << "! " << ans << endl;

  return 0;
}


#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <cctype>

#include <algorithm>
#include <random>
#include <bitset>
#include <queue>
#include <functional>
#include <set>
#include <map>
#include <vector>
#include <chrono>
#include <iostream>
#include <limits>
#include <numeric>

#define LOG(FMT...) fprintf(stderr, FMT)

using namespace std;

typedef long long ll;
typedef unsigned long long ull;

// mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

template<class T>
istream &operator>>(istream &is, vector<T> &v) {
  for (T &x : v)
    is >> x;
  return is;
}

template<class T>
ostream &operator<<(ostream &os, const vector<T> &v) {
  if (!v.empty()) {
    os << v.front();
    for (int i = 1; i < v.size(); ++i)
      os << ' ' << v[i];
  }
  return os;
}

int main() {

  int n;
  vector<pair<int, int>> res(1);
  cin >> n >> res[0].first >> res[0].second;

  auto ins = [&](int x) {
    cout << "+ " << x << endl;
    int rtrip, rstra;
    cin >> rtrip >> rstra;
    return make_pair(rtrip, rstra);
  };

  map<int, int> mp;
  for (int i = 1; i <= n; ++i) mp[i * (i - 1) / 2] = i;

  for (int i = n; i > 3; --i) res.push_back(ins(i - 1));
  res.push_back(ins(1));
  res.push_back(ins(2));
  res.push_back(ins(1));

  for (int i = n; i; --i) {
    res[i].first -= res[i - 1].first;
    res[i].second -= res[i - 1].second;
  }

  vector<int> ans(n + 1);
  ans[1] = mp[res[n].first] - 1;
  if (res[n - 2].second)
    ans[2] = mp[res[n - 1].first];
  ans[3] = res[n].second / (ans[2] + 1) - 1;
  ans[4] = res[n - 1].second / (ans[3] + 1) - (ans[1] + 1) - 1;
  for (int i = 4; i < n; ++i)
    ans[i + 1] = (res[n - i + 1].second - ans[i - 2] * ans[i - 3]) / (ans[i] + 1) - ans[i - 2] - 1;
  ++ans[n];

  ans.erase(ans.begin(), ans.begin() + 1);
  cout << "! " << ans << endl;

  return 0;
}


#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <cctype>

#include <algorithm>
#include <random>
#include <bitset>
#include <queue>
#include <functional>
#include <set>
#include <map>
#include <vector>
#include <chrono>
#include <iostream>
#include <limits>
#include <numeric>

#define LOG(FMT...) fprintf(stderr, FMT)

using namespace std;

typedef long long ll;
typedef unsigned long long ull;

// mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

template<class T>
istream &operator>>(istream &is, vector<T> &v) {
  for (T &x : v)
    is >> x;
  return is;
}

template<class T>
ostream &operator<<(ostream &os, const vector<T> &v) {
  if (!v.empty()) {
    os << v.front();
    for (int i = 1; i < v.size(); ++i)
      os << ' ' << v[i];
  }
  return os;
}

int main() {

  int n;
  vector<pair<int, int>> res(1);
  cin >> n >> res[0].first >> res[0].second;

  auto ins = [&](int x) {
    cout << "+ " << x << endl;
    int rtrip, rstra;
    cin >> rtrip >> rstra;
    return make_pair(rtrip, rstra);
  };

  map<int, int> mp;
  for (int i = 1; i <= n; ++i) mp[i * (i - 1) / 2] = i;

  for (int i = n; i > 3; --i) res.push_back(ins(i - 1));
  res.push_back(ins(1));
  res.push_back(ins(2));
  res.push_back(ins(1));

  for (int i = n; i; --i) {
    res[i].first -= res[i - 1].first;
    res[i].second -= res[i - 1].second;
  }

  vector<int> ans(n + 1);
  ans[1] = mp[res[n].first] - 1;
  if (res[n - 3].second)
    ans[2] = mp[res[n - 1].first];
  ans[3] = res[n].second / (ans[2] + 1) - 1;
  ans[4] = res[n - 1].second / (ans[3] + 1) - (ans[1] + 1) - 1;
  for (int i = 4; i < n; ++i)
    ans[i + 1] = (res[n - i + 1].second - ans[i - 2] * ans[i - 3]) / (ans[i] + 1) - ans[i - 2] - 1;
  ++ans[n];

  ans.erase(ans.begin(), ans.begin() + 1);
  cout << "! " << ans << endl;

  return 0;
}


//Awwawa! Dis cold yis ratten buy tEMMIE!
#include <bits/stdc++.h>
#define ll long long
#define maxn 205 /*rem*/
#define mod 998244353
#define db double
#define vi vector<int>
#define pb push_back
#define mp make_pair
#define pi pair<int, int>
#define fi first
#define se second

template <typename T> bool chkmax(T &x,T y){return x<y?x=y,true:false;}
template <typename T> bool chkmin(T &x,T y){return x>y?x=y,true:false;}

using namespace std;
int a[maxn];
vi ur;
vector<pi> re;
pi bg;
void ask(int d) {
	cout << "+ " <<  d << endl;
	fflush(stdout);
	ur.pb(d);
	int x, y;
	cin >> x >> y;
	re.pb(mp(x, y));
}
int d[maxn];
vector<vi> res;
pi chk(vi g) {
	int a = 0, b = 0;
	for (int i = 0; i < g.size() - 2; i++)
		b += g[i] * g[i + 1] * g[i + 2];
	for (auto v : g)
		a += d[v];
	return mp(a, b);
}
void jug(vi cur) {
	for (int i = re.size() - 1; i >= 0; i--) {
			pi ug = chk(cur);
			if (ug != re[i]) return;
			if (i == 0) res.pb(cur);
			else {
				cur[ur[i] - 1]--;
				if (cur[ur[i] - 1] < 0) return;
			}
		}
}
int lt(int k) {
	return re.size()  -k;
}
int gt(int dv, int f0) {
	for (int l = 0; l < maxn; l++) {
		if (l == 0 && !f0) continue;
		if (d[l + 1] - d[l] == dv) return l + 1;
	}
}
int main() {
	int n;
	cin >> n;
	int x, y;
	cin >> x >> y;
	re.pb(mp(x, y));
	ur.pb(0);
	for (int i = 0; i < maxn; i++)
		d[i] = i * (i - 1) * (i - 2) / 6;
	memset(a, -1, sizeof(a));
	ask(3), ask(1); int fg = (re[lt(1)].se - re[lt(2)].se);
	if (fg == 0) fg = 1;
	else fg = 0;
	ask(2); a[2] = gt(re[lt(1)].fi - re[lt(2)].fi, fg);
	ask(1); a[1] = gt(re[lt(1)].fi - re[lt(2)].fi, 0);
 	a[3] = (re[lt(1)].se - re[lt(2)].se) / a[2];
 	for (int i = 4; i <= n - 1; i++) {
 		int q0 = 0;
		if (i != 4) {
			int dm = re[re.size() - 1].se - re[re.size() - 2].se;
			if (dm == a[i - 2] * a[i - 3]) q0 = 1;
			else q0 = 0;
		}
		else {
			int dm = re[re.size() - 2].se - re[re.size() - 3].se;
			if (dm == (a[1] - 1) * a[3]) q0 = 1;
			else q0 = 0;
		}
		ask(i);
		a[i] = gt(re[lt(1)].fi - re[lt(2)].fi, q0);
	}
//	for (int i = 1; i <= n - 1; i++)
//		cout << a[i] << ' ';
	vi cur(n);
	for (int i = 1; i <= n; i++)
		cur[i - 1] = a[i];
	for (int m = 0; m <= n; m++)
		cur[n - 1] = m, jug(cur);
	if (res.size() >= 2) while(1);
//	cout << res.size() << endl;
	cout << "! ";
	for (auto v : res[0])
		cout << v << ' ';
	cout << endl;
	fflush(stdout);
	return 0;
}
/*
5
1 6
2 9
2 18
5 24
5 40
6 44

*/


//Awwawa! Dis cold yis ratten buy tEMMIE!
#include <bits/stdc++.h>
#define ll long long
#define maxn 3005 /*rem*/
#define mod 998244353
#define db double
#define vi vector<int>
#define pb push_back
#define mp make_pair
#define pi pair<int, int>
#define fi first
#define se second

template <typename T> bool chkmax(T &x,T y){return x<y?x=y,true:false;}
template <typename T> bool chkmin(T &x,T y){return x>y?x=y,true:false;}

using namespace std;
ll ksm(ll a, ll b) {
   if (!b) return 1;
   ll ns = ksm(a, b >> 1);
   ns = ns * ns % mod;
   if (b & 1) ns = ns * a % mod;
   return ns;
}
int dp[maxn][maxn];
char s[maxn];
char t[maxn];
int n, m;
int main() {
	scanf("%s", s + 1);
	scanf("%s", t + 1);
	n = strlen(s + 1), m = strlen(t + 1);
	ll ans = 0;
	for (int i = 0; i <= n; i++)
		for (int j = 1; j <= m + 1; j++) {
			if (i == 0) dp[i][j] = 1;
			else {
				if (j == m + 1) {
					dp[i][j] = 2 * dp[i - 1][j] % mod;
				}
				else {
					if (s[i] == t[j])
						dp[i][j] = dp[i - 1][j + 1];

						// 放到末尾
					int nl = m + 1 - j;
					int rs = 0;
					if (i > nl) rs = dp[i - 1][j];
					else {
						int ed = j + i - 1;
						if (s[i] == t[ed]) rs = dp[i - 1][j];
					}
					dp[i][j] += rs;
					dp[i][j] %= mod;
				}
			}
		//	cout << i << ' ' << j << ' ' << dp[i][j] << endl;
			if (i >= m && j == 1)
				ans += dp[i][j], ans %= mod;
		}
	cout << ans << endl;
	return 0;
}


#include<bits/stdc++.h>
using namespace std;
mt19937 rng(chrono::system_clock::now().time_since_epoch().count());
mt19937_64 rngll(rng());
typedef long long ll;
typedef pair<int,int>pii;
typedef pair<int,ll>pil;
typedef pair<ll,ll>pll;
const int mn=2e5+10;
const ll mod=998244353;
int s[mn],g[mn];
int a[mn],b[mn];
int n;
bool check2(int g,int s){
    for(int i=1;i<=n;i++)g-=b[i]*(b[i]-1)*(b[i]-2)/6;
    if(g)return 0;
    for(int i=1;i+2<=n;i++)s-=b[i]*b[i+1]*b[i+2];
    if(s)return 0;
    return 1;
}
bool check(){
    bool ok=1;
    memcpy(b,a,sizeof(a));
    if(!check2(g[n],s[n]))return 0;
    for(int i=n-1;i>=0;i--){
        b[max(i,1)]++;
        if(!check2(g[i],s[i]))return 0;
    }
    return 1;
}
int main(){
    scanf("%d",&n);
    scanf("%d%d",g+n,s+n);
    for(int i=n-1;i>=0;i--){
        int p;
        if(i>=3)p=i;
        else if(i==2)p=1;
        else if(i==1)p=2;
        else p=1;
        printf("+ %d\n",p);
        fflush(stdout);
        scanf("%d%d",g+i,s+i);
    }
    for(int i=0;i<=100;i++)if((g[0]-g[1])*6==(i+2)*(i+1)*i-(i+1)*i*(i-1))a[1]=i;
    a[3]=((s[0]-s[1])-(s[2]-s[3]))-1;
    a[2]=(s[2]-s[3])/(a[3]+1);
    a[4]=(s[1]-s[2]-(a[1]+1)*(a[3]+1))/(a[3]+1);
    for (int j = 5; j <= n; j++) {
        int d=s[j-2]-s[j-1]-a[j-3]*a[j-4]-a[j-3]*(a[j-1]+1);
        a[j]=d/(a[j-1]+1)-(j!=n);
        if(a[j]<0)a[j]=0;
    }
    printf("!");
    for(int i=1;i<=n;i++)printf(" %d",a[i]);
    printf("\n");
    fflush(stdout);
}


#include<bits/stdc++.h>
using namespace std;
mt19937 rng(chrono::system_clock::now().time_since_epoch().count());
mt19937_64 rngll(rng());
typedef long long ll;
typedef pair<int,int>pii;
typedef pair<int,ll>pil;
typedef pair<ll,ll>pll;
const int mn=2e5+10;
const ll mod=998244353;
int s[mn],g[mn];
int a[mn],b[mn];
int n;
bool check2(int g,int s){
    for(int i=1;i<=n;i++)g-=b[i]*(b[i]-1)*(b[i]-2)/6;
    if(g)return 0;
    for(int i=1;i+2<=n;i++)s-=b[i]*b[i+1]*b[i+2];
    if(s)return 0;
}
bool check(){
    bool ok=1;
    memcpy(b,a,sizeof(a));
    if(!check2(g[n],s[n]))return 0;
    for(int i=n-1;i>=0;i--){
        b[max(i,1)]++;
        if(!check2(g[i],s[i]))return 0;
    }
    return 1;
}
int main(){
    scanf("%d",&n);
    scanf("%d%d",g+n,s+n);
    for(int i=n-1;i>=0;i--){
        printf("+ %d\n",max(i,1));
        fflush(stdout);
        scanf("%d%d",g+i,s+i);
    }
    for(int i=0;i<=100;i++)if((g[0]-g[1])*6==(i+2)*(i+1)*i-(i+1)*i*(i-1))a[1]=i;
    for(int i=0;i<=100;i++){
        a[2] = i;
        a[3]=(s[0]-s[1])/(a[2]+1);
        for (int j = 4; j <= 100; j++) {
            int d=s[j-2]-s[j-1]-a[j-3]*a[j-4]-a[j-3]*(a[j-1]+1);
            a[j]=d/(a[j-1]+1);
            if(a[j]<0)a[j]=0;
        }
        if(check()){
            printf("!");
            for(int i=1;i<=n;i++)printf(" %d",a[i]);
            printf("\n");
            fflush(stdout);
            return 0;
        }
    }
    assert(0);
}


#include<bits/stdc++.h>
using namespace std;
mt19937 rng(chrono::system_clock::now().time_since_epoch().count());
mt19937_64 rngll(rng());
typedef long long ll;
typedef pair<int,int>pii;
typedef pair<int,ll>pil;
typedef pair<ll,ll>pll;
const int mn=2e5+10;
const ll mod=998244353;
int s[mn],g[mn];
int a[mn],b[mn];
int n;
bool check2(int g,int s){
    for(int i=1;i<=n;i++)g-=b[i]*(b[i]-1)*(b[i]-2)/6;
    if(g)return 0;
    for(int i=1;i+2<=n;i++)s-=b[i]*b[i+1]*b[i+2];
    if(s)return 0;
    return 1;
}
bool check(){
    bool ok=1;
    memcpy(b,a,sizeof(a));
    if(!check2(g[n],s[n]))return 0;
    for(int i=n-1;i>=0;i--){
        b[max(i,1)]++;
        if(!check2(g[i],s[i]))return 0;
    }
    return 1;
}
int main(){
    scanf("%d",&n);
    scanf("%d%d",g+n,s+n);
    for(int i=n-1;i>=0;i--){
        int p;
        if(i>=3)p=i;
        else if(i==2)p=1;
        else if(i==1)p=2;
        else p=1;
        printf("+ %d\n",p);
        fflush(stdout);
        scanf("%d%d",g+i,s+i);
    }
    for(int i=0;i<=100;i++)if((g[0]-g[1])*6==(i+2)*(i+1)*i-(i+1)*i*(i-1))a[1]=i;
    a[3]=((s[0]-s[1])-(s[2]-s[3]))-1;
    a[2]=(s[2]-s[3])/(a[3]+1);
    a[4]=(s[1]-s[2]-(a[1]+1)*(a[3]+1))/(a[3]+1)-(4!=n);
    for (int j = 5; j <= n; j++) {
        int d=s[j-2]-s[j-1]-a[j-3]*a[j-4]-a[j-3]*(a[j-1]+1);
        a[j]=d/(a[j-1]+1)-(j!=n);
        if(a[j]<0)a[j]=0;
    }
    printf("!");
    for(int i=1;i<=n;i++)printf(" %d",a[i]);
    printf("\n");
    fflush(stdout);
}


#include<bits/stdc++.h>
using namespace std;
mt19937 rng(chrono::system_clock::now().time_since_epoch().count());
mt19937_64 rngll(rng());
typedef long long ll;
typedef pair<int,int>pii;
typedef pair<int,ll>pil;
typedef pair<ll,ll>pll;
const int mn=2e5+10;
const ll mod=998244353;
int s[mn],g[mn];
int a[mn],b[mn];
int n;
bool check2(int g,int s){
    for(int i=1;i<=n;i++)g-=b[i]*(b[i]-1)*(b[i]-2)/6;
    if(g)return 0;
    for(int i=1;i+2<=n;i++)s-=b[i]*b[i+1]*b[i+2];
    if(s)return 0;
    return 1;
}
bool check(){
    bool ok=1;
    memcpy(b,a,sizeof(a));
    if(!check2(g[n],s[n]))return 0;
    for(int i=n-1;i>=0;i--){
        b[max(i,1)]++;
        if(!check2(g[i],s[i]))return 0;
    }
    return 1;
}
int main(){
    scanf("%d",&n);
    scanf("%d%d",g+n,s+n);
    for(int i=n-1;i>=0;i--){
        printf("+ %d\n",max(i,1));
        fflush(stdout);
        scanf("%d%d",g+i,s+i);
    }
    for(int i=0;i<=100;i++)if((g[0]-g[1])*6==(i+2)*(i+1)*i-(i+1)*i*(i-1))a[1]=i;
    for(int i=0;i<=100;i++){
        a[2] = i;
        a[3]=(s[0]-s[1])/(a[2]+1)-1;
        for (int j = 4; j <= n; j++) {
            int d=s[j-2]-s[j-1]-a[j-3]*a[j-4]-a[j-3]*(a[j-1]+1);
            a[j]=d/(a[j-1]+1)-(j!=n);
            if(a[j]<0)a[j]=0;
        }
        if(check()){
            printf("!");
            for(int i=1;i<=n;i++)printf(" %d",a[i]);
            printf("\n");
            fflush(stdout);
            return 0;
        }
    }
    assert(0);
}


#include<bits/stdc++.h>
using namespace std;
mt19937 rng(chrono::system_clock::now().time_since_epoch().count());
mt19937_64 rngll(rng());
typedef long long ll;
typedef pair<int,int>pii;
typedef pair<int,ll>pil;
typedef pair<ll,ll>pll;
const int mn=2e5+10;
const ll mod=998244353;
int s[mn],g[mn];
int a[mn],b[mn];
int n;
bool check2(int g,int s){
    for(int i=1;i<=n;i++)g-=b[i]*(b[i]-1)*(b[i]-2)/6;
    if(g)return 0;
    for(int i=1;i+2<=n;i++)s-=b[i]*b[i+1]*b[i+2];
    if(s)return 0;
    return 1;
}
bool check(){
    bool ok=1;
    memcpy(b,a,sizeof(a));
    if(!check2(g[n],s[n]))return 0;
    for(int i=n-1;i>=0;i--){
        b[max(i,1)]++;
        if(!check2(g[i],s[i]))return 0;
    }
    return 1;
}
int main(){
    scanf("%d",&n);
    scanf("%d%d",g+n,s+n);
    for(int i=n-1;i>=0;i--){
        int p;
        if(i>=3)p=i;
        else if(i==2)p=1;
        else if(i==1)p=2;
        else p=1;
        printf("+ %d\n",p);
        fflush(stdout);
        scanf("%d%d",g+i,s+i);
    }
    for(int i=0;i<=100;i++)if((g[0]-g[1])*6==(i+2)*(i+1)*i-(i+1)*i*(i-1))a[1]=i;
    a[3]=((s[0]-s[1])-(s[2]-s[3]))-1;
    a[2]=(s[2]-s[3])/(a[3]+1);
    a[4]=(s[1]-s[2]-(a[1]+1)*(a[3]+1))/(a[3]+1)-1;
    for (int j = 5; j <= n; j++) {
        int d=s[j-2]-s[j-1]-a[j-3]*a[j-4]-a[j-3]*(a[j-1]+1);
        a[j]=d/(a[j-1]+1)-(j!=n);
        if(a[j]<0)a[j]=0;
    }
    printf("!");
    for(int i=1;i<=n;i++)printf(" %d",a[i]);
    printf("\n");
    fflush(stdout);
}


#include<bits/stdc++.h>
using namespace std;
mt19937 rng(chrono::system_clock::now().time_since_epoch().count());
mt19937_64 rngll(rng());
typedef long long ll;
typedef pair<int,int>pii;
typedef pair<int,ll>pil;
typedef pair<ll,ll>pll;
const int mn=2e5+10;
const ll mod=998244353;
int s[mn],g[mn];
int a[mn],b[mn];
int n;
bool check2(int g,int s){
    for(int i=1;i<=n;i++)g-=b[i]*(b[i]-1)*(b[i]-2)/6;
    if(g)return 0;
    for(int i=1;i+2<=n;i++)s-=b[i]*b[i+1]*b[i+2];
    if(s)return 0;
    return 1;
}
bool check(){
    bool ok=1;
    memcpy(b,a,sizeof(a));
    if(!check2(g[n],s[n]))return 0;
    for(int i=n-1;i>=0;i--){
        b[max(i,1)]++;
        if(!check2(g[i],s[i]))return 0;
    }
    return 1;
}
int main(){
    scanf("%d",&n);
    scanf("%d%d",g+n,s+n);
    for(int i=n-1;i>=0;i--){
        int p;
        if(i>=3)p=i;
        else if(i==2)p=1;
        else if(i==1)p=2;
        else p=1;
        printf("+ %d\n",p);
        fflush(stdout);
        scanf("%d%d",g+i,s+i);
    }
    for(int i=0;i<=100;i++)if((g[0]-g[1])*6==(i+2)*(i+1)*i-(i+1)*i*(i-1))a[1]=i;
    a[3]=((s[0]-s[1])-(s[2]-s[3]))-1;
    a[2]=(s[2]-s[3])/(a[3]+1);
    a[4]=(s[1]-s[2]-(a[1]+1)*(a[3]+1))/(a[3]+1);
    for (int j = 4; j <= n; j++) {
        int d=s[j-2]-s[j-1]-a[j-3]*a[j-4]-a[j-3]*(a[j-1]+1);
        a[j]=d/(a[j-1]+1)-(j!=n);
        if(a[j]<0)a[j]=0;
    }
    printf("!");
    for(int i=1;i<=n;i++)printf(" %d",a[i]);
    printf("\n");
    fflush(stdout);
}


//This file was created by Zory at 2020.04.26 16:00:11
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
// typedef __int128 ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
#define FR first
#define SE second
#define MP make_pair
#define PB push_back
#define vc vector
#define db double
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define bin(x) (1ll<<(x))
#define fo(i,l,r) for(int i=(l),I=(r);i<=I;i++)
#define fd(i,r,l) for(int i=(r),I=(l);i>=I;i--)
#define mem(x,val) memset(x,val,sizeof x)
#define Swap(a,b,n) for(int I=0;I<=n;I++) swap(a[I],b[I])
#define PC __builtin_popcountll
#ifdef DEBUG
	#define debug(A,args...) fprintf(stderr,A,##args)
#else
	#define debug(A,args...) printf("")
#endif
#define deb debug("line %d\n",__LINE__)
namespace mine
{
	ll qread()
	{
		ll ans=0,f=1;char c=getchar();
		while(c<'0' or c>'9') {if(c=='-')f=-1;c=getchar();}
		while('0'<=c and c<='9') ans=ans*10+c-'0',c=getchar();
		return ans*f;
	}
	void write(ll num){if(num<0) putchar('-'),num=-num;if(num>=10) write(num/10);putchar('0'+num%10);}
	void write1(ll num){write(num);putchar(' ');}
	void write2(ll num){write(num);putchar('\n');}
	template<typename T>inline bool chmax(T&a,const T&b){return a<b?a=b,1:0;}
	template<typename T>inline bool chmin(T&a,const T&b){return a>b?a=b,1:0;}
	ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
	bool IN(ll x,ll l,ll r){return l<=x and x<=r;}
	void GG(){puts("-1");exit(0);}

	const db eps=1e-8;
	const int INF=0x3f3f3f3f;
	const int MOD=998244353;
	int mm(const int x){return x>=MOD?x-MOD:x;}
	template<typename T> void add(T &x,const int &y){x=(x+y>=MOD?x+y-MOD:x+y);}
	ll qpower(ll x,ll e,int mod=MOD){ll ans=1;while(e){if(e&1)ans=ans*x%mod;x=x*x%mod;e>>=1;}return ans;}
	ll invm(ll x){return qpower(x,MOD-2);}
	const int MM=5e6+10;
	ll fac[MM],facinv[MM],Inv[MM];ll Comb(int n,int m){return n<0 or n<m?0:fac[n]*facinv[m]%MOD*facinv[n-m]%MOD;}
	void PRE()
	{
		fac[0]=1;fo(i,1,MM-1) fac[i]=fac[i-1]*i%MOD;
		facinv[MM-1]=invm(fac[MM-1]);fd(i,MM-1,1) facinv[i-1]=facinv[i]*i%MOD;
		Inv[1]=1;fo(i,2,MM-1) Inv[i]=(MOD-MOD/i)*Inv[MOD%i]%MOD;
	}
	const int N=1e6+10;
	//------------------FIXED------------------
	int ans[N],go[N];pii ret[N];
	pii ask(int i){printf("+ %d\n",i),fflush(stdout);int A=qread(),B=qread();return {A,B};}
	void main()
	{
		fo(i,1,100) go[i*(i-1)/2]=i;
		int n=qread();ret[0].FR=qread(),ret[0].SE=qread();
		fd(i,n-1,3) ret[i]=ask(i);ret[1]=ask(1),ret[2]=ask(2);
		pii now=ask(1);ans[1]=go[now.FR-ret[2].FR]-1;
		ans[3]=(now.SE-ret[2].SE)-(ret[1].SE-ret[3].SE)-1,ans[2]=(ret[1].SE-ret[3].SE)/(ans[3]+1);
		ans[2+2]=(ret[2].SE-ret[1].SE-(ans[1]+1)*(ans[3]+1))/(ans[3]+1)-1;
		fo(i,3,n-2) ans[i+2]=(ret[i].SE-ret[i+1].SE-ans[i-2]*ans[i-1]-ans[i-1]*(ans[i+1]+1))/(ans[i+1]+1)-1;
		ans[n]++;printf("! ");fo(i,1,n) write1(ans[i]);fflush(stdout);
	}
};//变量重名！
signed main()
{
	#ifdef DEBUG
	//freopen("a.in","r",stdin);
	//freopen("z.txt","r",stdin);
	//freopen("a.out","w",stdout);
	#endif
	srand(time(0));
	mine::main();
	//debug("\n------------------------------------------\nTime: %.2lf s\n",1.0*clock()/CLOCKS_PER_SEC);
}


//This file was created by Zory at 2020.04.26 16:00:11
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
// typedef __int128 ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
#define FR first
#define SE second
#define MP make_pair
#define PB push_back
#define vc vector
#define db double
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define bin(x) (1ll<<(x))
#define fo(i,l,r) for(int i=(l),I=(r);i<=I;i++)
#define fd(i,r,l) for(int i=(r),I=(l);i>=I;i--)
#define mem(x,val) memset(x,val,sizeof x)
#define Swap(a,b,n) for(int I=0;I<=n;I++) swap(a[I],b[I])
#define PC __builtin_popcountll
#ifdef DEBUG
	#define debug(A,args...) fprintf(stderr,A,##args)
#else
	#define debug(A,args...) printf("")
#endif
#define deb debug("line %d\n",__LINE__)
namespace mine
{
	ll qread()
	{
		ll ans=0,f=1;char c=getchar();
		while(c<'0' or c>'9') {if(c=='-')f=-1;c=getchar();}
		while('0'<=c and c<='9') ans=ans*10+c-'0',c=getchar();
		return ans*f;
	}
	void write(ll num){if(num<0) putchar('-'),num=-num;if(num>=10) write(num/10);putchar('0'+num%10);}
	void write1(ll num){write(num);putchar(' ');}
	void write2(ll num){write(num);putchar('\n');}
	template<typename T>inline bool chmax(T&a,const T&b){return a<b?a=b,1:0;}
	template<typename T>inline bool chmin(T&a,const T&b){return a>b?a=b,1:0;}
	ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
	bool IN(ll x,ll l,ll r){return l<=x and x<=r;}
	void GG(){puts("-1");exit(0);}

	const db eps=1e-8;
	const int INF=0x3f3f3f3f;
	const int MOD=998244353;
	int mm(const int x){return x>=MOD?x-MOD:x;}
	template<typename T> void add(T &x,const int &y){x=(x+y>=MOD?x+y-MOD:x+y);}
	ll qpower(ll x,ll e,int mod=MOD){ll ans=1;while(e){if(e&1)ans=ans*x%mod;x=x*x%mod;e>>=1;}return ans;}
	ll invm(ll x){return qpower(x,MOD-2);}
	const int MM=5e6+10;
	ll fac[MM],facinv[MM],Inv[MM];ll Comb(int n,int m){return n<0 or n<m?0:fac[n]*facinv[m]%MOD*facinv[n-m]%MOD;}
	void PRE()
	{
		fac[0]=1;fo(i,1,MM-1) fac[i]=fac[i-1]*i%MOD;
		facinv[MM-1]=invm(fac[MM-1]);fd(i,MM-1,1) facinv[i-1]=facinv[i]*i%MOD;
		Inv[1]=1;fo(i,2,MM-1) Inv[i]=(MOD-MOD/i)*Inv[MOD%i]%MOD;
	}
	const int N=1e6+10;
	//------------------FIXED------------------
	int ans[N],c[N],go[N];
	void main()
	{
		fo(i,1,100) go[i*(i-1)/2]=i;
		int n=qread(),lstA=qread(),lstB=qread();
		bool is0=0;//对于i=1，只会在变大时使用is0
		fo(i,1,n-1)//i前面已知，且c[i]是否是0已知
		{
			printf("+ %d\n",i),fflush(stdout);int A=qread(),B=qread();
			if(i==1 and A==lstA){ if(ans[i]<0) ans[i]=0,c[i]=2; else ans[i]--,i--,lstB=B;continue; }//最多两次
			else if(is0) ans[i]=0,c[i]=1;
			else ans[i]+=go[A-lstA],c[i]=go[A-lstA]+1;
			is0=(B-lstB-(i>=3?c[i-2]*c[i-1]:0)==0);lstA=A,lstB=B;
		}
		fo(i,2,n-2) lstB-=c[i-1]*c[i]*c[i+1];assert(lstB%(c[n-2]*c[n-1])==0);ans[n]=lstB/c[n-2]/c[n-1];
		printf("! ");fo(i,1,n) write1(ans[i]);fflush(stdout);
	}
};//变量重名！
signed main()
{
	#ifdef DEBUG
	//freopen("a.in","r",stdin);
	//freopen("z.txt","r",stdin);
	//freopen("a.out","w",stdout);
	#endif
	srand(time(0));
	mine::main();
	//debug("\n------------------------------------------\nTime: %.2lf s\n",1.0*clock()/CLOCKS_PER_SEC);
}


//This file was created by Zory at 2020.04.26 16:00:11
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
// typedef __int128 ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
#define FR first
#define SE second
#define MP make_pair
#define PB push_back
#define vc vector
#define db double
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define bin(x) (1ll<<(x))
#define fo(i,l,r) for(int i=(l),I=(r);i<=I;i++)
#define fd(i,r,l) for(int i=(r),I=(l);i>=I;i--)
#define mem(x,val) memset(x,val,sizeof x)
#define Swap(a,b,n) for(int I=0;I<=n;I++) swap(a[I],b[I])
#define PC __builtin_popcountll
#ifdef DEBUG
	#define debug(A,args...) fprintf(stderr,A,##args)
#else
	#define debug(A,args...) printf("")
#endif
#define deb debug("line %d\n",__LINE__)
namespace mine
{
	ll qread()
	{
		ll ans=0,f=1;char c=getchar();
		while(c<'0' or c>'9') {if(c=='-')f=-1;c=getchar();}
		while('0'<=c and c<='9') ans=ans*10+c-'0',c=getchar();
		return ans*f;
	}
	void write(ll num){if(num<0) putchar('-'),num=-num;if(num>=10) write(num/10);putchar('0'+num%10);}
	void write1(ll num){write(num);putchar(' ');}
	void write2(ll num){write(num);putchar('\n');}
	template<typename T>inline bool chmax(T&a,const T&b){return a<b?a=b,1:0;}
	template<typename T>inline bool chmin(T&a,const T&b){return a>b?a=b,1:0;}
	ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
	bool IN(ll x,ll l,ll r){return l<=x and x<=r;}
	void GG(){puts("-1");exit(0);}

	const db eps=1e-8;
	const int INF=0x3f3f3f3f;
	const int MOD=998244353;
	int mm(const int x){return x>=MOD?x-MOD:x;}
	template<typename T> void add(T &x,const int &y){x=(x+y>=MOD?x+y-MOD:x+y);}
	ll qpower(ll x,ll e,int mod=MOD){ll ans=1;while(e){if(e&1)ans=ans*x%mod;x=x*x%mod;e>>=1;}return ans;}
	ll invm(ll x){return qpower(x,MOD-2);}
	const int MM=5e6+10;
	ll fac[MM],facinv[MM],Inv[MM];ll Comb(int n,int m){return n<0 or n<m?0:fac[n]*facinv[m]%MOD*facinv[n-m]%MOD;}
	void PRE()
	{
		fac[0]=1;fo(i,1,MM-1) fac[i]=fac[i-1]*i%MOD;
		facinv[MM-1]=invm(fac[MM-1]);fd(i,MM-1,1) facinv[i-1]=facinv[i]*i%MOD;
		Inv[1]=1;fo(i,2,MM-1) Inv[i]=(MOD-MOD/i)*Inv[MOD%i]%MOD;
	}
	const int N=1e6+10;
	//------------------FIXED------------------
	int ans[N],c[N],go[N];
	void main()
	{
		fo(i,1,100) go[i*(i-1)/2]=i;
		int n=qread(),lstA=qread(),lstB=qread();
		bool is0;
		fo(i,1,n-1)//i前面已知，且c[i]是否是0已知
		{
			printf("+ %d\n",i),fflush(stdout);int A=qread(),B=qread();
			if(i==1 and A==lstA){ if(ans[i]<0) ans[i]=0,c[i]=2; else ans[i]--,i--; }//最多两次
			else if(is0) ans[i]=0,c[i]=1;
			else ans[i]+=go[A-lstA],c[i]=go[A-lstA]+1;
			is0=(B-lstB-c[i-2]*c[i-1]==0 and i+2<=n);lstA=A,lstB=B;
		}
		fo(i,2,n-2) lstB-=c[i-1]*c[i]*c[i+1];debug("lstB=%d\n",lstB);
		fo(i,1,n) debug("i=%d ans=%d c=%d\n",i,ans[i],c[i]);
		assert(lstB%(c[n-2]*c[n-1])==0);ans[n]=lstB/c[n-2]/c[n-1];
		printf("! ");fo(i,1,n) write1(ans[i]);fflush(stdout);
	}
};//变量重名！
signed main()
{
	#ifdef DEBUG
	//freopen("a.in","r",stdin);
	//freopen("z.txt","r",stdin);
	//freopen("a.out","w",stdout);
	#endif
	srand(time(0));
	mine::main();
	//debug("\n------------------------------------------\nTime: %.2lf s\n",1.0*clock()/CLOCKS_PER_SEC);
}


//This file was created by Zory at 2020.04.26 16:00:11
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
// typedef __int128 ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
#define FR first
#define SE second
#define MP make_pair
#define PB push_back
#define vc vector
#define db double
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define bin(x) (1ll<<(x))
#define fo(i,l,r) for(int i=(l),I=(r);i<=I;i++)
#define fd(i,r,l) for(int i=(r),I=(l);i>=I;i--)
#define mem(x,val) memset(x,val,sizeof x)
#define Swap(a,b,n) for(int I=0;I<=n;I++) swap(a[I],b[I])
#define PC __builtin_popcountll
#ifdef DEBUG
	#define debug(A,args...) fprintf(stderr,A,##args)
#else
	#define debug(A,args...) printf("")
#endif
#define deb debug("line %d\n",__LINE__)
namespace mine
{
	ll qread()
	{
		ll ans=0,f=1;char c=getchar();
		while(c<'0' or c>'9') {if(c=='-')f=-1;c=getchar();}
		while('0'<=c and c<='9') ans=ans*10+c-'0',c=getchar();
		return ans*f;
	}
	void write(ll num){if(num<0) putchar('-'),num=-num;if(num>=10) write(num/10);putchar('0'+num%10);}
	void write1(ll num){write(num);putchar(' ');}
	void write2(ll num){write(num);putchar('\n');}
	template<typename T>inline bool chmax(T&a,const T&b){return a<b?a=b,1:0;}
	template<typename T>inline bool chmin(T&a,const T&b){return a>b?a=b,1:0;}
	ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
	bool IN(ll x,ll l,ll r){return l<=x and x<=r;}
	void GG(){puts("-1");exit(0);}

	const db eps=1e-8;
	const int INF=0x3f3f3f3f;
	const int MOD=998244353;
	int mm(const int x){return x>=MOD?x-MOD:x;}
	template<typename T> void add(T &x,const int &y){x=(x+y>=MOD?x+y-MOD:x+y);}
	ll qpower(ll x,ll e,int mod=MOD){ll ans=1;while(e){if(e&1)ans=ans*x%mod;x=x*x%mod;e>>=1;}return ans;}
	ll invm(ll x){return qpower(x,MOD-2);}
	const int MM=5e6+10;
	ll fac[MM],facinv[MM],Inv[MM];ll Comb(int n,int m){return n<0 or n<m?0:fac[n]*facinv[m]%MOD*facinv[n-m]%MOD;}
	void PRE()
	{
		fac[0]=1;fo(i,1,MM-1) fac[i]=fac[i-1]*i%MOD;
		facinv[MM-1]=invm(fac[MM-1]);fd(i,MM-1,1) facinv[i-1]=facinv[i]*i%MOD;
		Inv[1]=1;fo(i,2,MM-1) Inv[i]=(MOD-MOD/i)*Inv[MOD%i]%MOD;
	}
	const int N=1e6+10;
	//------------------FIXED------------------
	int ans[N];pii ret[N];
	pii ask(int i){ printf("+ %d\n",i),fflush(stdout);int A=qread(),B=qread();return {A,B}; }
	void main()
	{
		int n=qread();ret[0].FR=qread(),ret[0].SE=qread();
		fd(i,n-1,3) ret[i]=ask(i);ret[1]=ask(1),ret[2]=ask(2);
		pii now=ask(1);ans[1]=sqrt(now.FR-ret[2].FR)*2;
		ans[3]=(now.SE-ret[2].SE)-(ret[1].SE-ret[3].SE)-1,ans[2]=(ret[1].SE-ret[3].SE)/(ans[3]+1);
		ans[2+2]=(ret[2].SE-ret[1].SE)/(ans[3]+1)-(ans[1]+1)-1;
		fo(i,3,n-2) ans[i+2]=(ret[i].SE-ret[i+1].SE-ans[i-2]*ans[i-1])/(ans[i+1]+1)-ans[i-1]-1;
		ans[n]++;printf("! ");fo(i,1,n) write1(ans[i]);fflush(stdout);
	}
};//变量重名！
signed main()
{
	#ifdef DEBUG
	//freopen("a.in","r",stdin);
	//freopen("z.txt","r",stdin);
	//freopen("a.out","w",stdout);
	#endif
	srand(time(0));
	mine::main();
	//debug("\n------------------------------------------\nTime: %.2lf s\n",1.0*clock()/CLOCKS_PER_SEC);
}


//This file was created by Zory at 2020.04.26 16:00:11
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
// typedef __int128 ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
#define FR first
#define SE second
#define MP make_pair
#define PB push_back
#define vc vector
#define db double
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define bin(x) (1ll<<(x))
#define fo(i,l,r) for(int i=(l),I=(r);i<=I;i++)
#define fd(i,r,l) for(int i=(r),I=(l);i>=I;i--)
#define mem(x,val) memset(x,val,sizeof x)
#define Swap(a,b,n) for(int I=0;I<=n;I++) swap(a[I],b[I])
#define PC __builtin_popcountll
#ifdef DEBUG
	#define debug(A,args...) fprintf(stderr,A,##args)
#else
	#define debug(A,args...) printf("")
#endif
#define deb debug("line %d\n",__LINE__)
namespace mine
{
	ll qread()
	{
		ll ans=0,f=1;char c=getchar();
		while(c<'0' or c>'9') {if(c=='-')f=-1;c=getchar();}
		while('0'<=c and c<='9') ans=ans*10+c-'0',c=getchar();
		return ans*f;
	}
	void write(ll num){if(num<0) putchar('-'),num=-num;if(num>=10) write(num/10);putchar('0'+num%10);}
	void write1(ll num){write(num);putchar(' ');}
	void write2(ll num){write(num);putchar('\n');}
	template<typename T>inline bool chmax(T&a,const T&b){return a<b?a=b,1:0;}
	template<typename T>inline bool chmin(T&a,const T&b){return a>b?a=b,1:0;}
	ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
	bool IN(ll x,ll l,ll r){return l<=x and x<=r;}
	void GG(){puts("-1");exit(0);}

	const db eps=1e-8;
	const int INF=0x3f3f3f3f;
	const int MOD=998244353;
	int mm(const int x){return x>=MOD?x-MOD:x;}
	template<typename T> void add(T &x,const int &y){x=(x+y>=MOD?x+y-MOD:x+y);}
	ll qpower(ll x,ll e,int mod=MOD){ll ans=1;while(e){if(e&1)ans=ans*x%mod;x=x*x%mod;e>>=1;}return ans;}
	ll invm(ll x){return qpower(x,MOD-2);}
	const int MM=5e6+10;
	ll fac[MM],facinv[MM],Inv[MM];ll Comb(int n,int m){return n<0 or n<m?0:fac[n]*facinv[m]%MOD*facinv[n-m]%MOD;}
	void PRE()
	{
		fac[0]=1;fo(i,1,MM-1) fac[i]=fac[i-1]*i%MOD;
		facinv[MM-1]=invm(fac[MM-1]);fd(i,MM-1,1) facinv[i-1]=facinv[i]*i%MOD;
		Inv[1]=1;fo(i,2,MM-1) Inv[i]=(MOD-MOD/i)*Inv[MOD%i]%MOD;
	}
	const int N=1e6+10;
	//------------------FIXED------------------
	int ans[N],c[N],go[N];
	void main()
	{
		fo(i,1,100) go[i*(i-1)/2]=i;
		int n=qread(),lstA=qread(),lstB=qread();
		bool is0=0;//对于i=1，只会在变大时使用is0
		fo(i,1,n-1)//i前面已知，且c[i]是否是0已知
		{
			printf("+ %d\n",i),fflush(stdout);int A=qread(),B=qread();
			if(i==1 and A==lstA){ if(ans[i]<0) ans[i]=0,c[i]=2; else {ans[i]--,i--,lstB=B;continue;} }//最多两次
			else if(is0) ans[i]=0,c[i]=1;
			else ans[i]+=go[A-lstA],c[i]=go[A-lstA]+1;
			is0=(B-lstB-(i>=3?c[i-2]*c[i-1]:0)==0);lstA=A,lstB=B;
		}
		fo(i,2,n-2) lstB-=c[i-1]*c[i]*c[i+1];assert(lstB%(c[n-2]*c[n-1])==0);ans[n]=lstB/c[n-2]/c[n-1];
		printf("! ");fo(i,1,n) write1(ans[i]);fflush(stdout);
	}
};//变量重名！
signed main()
{
	#ifdef DEBUG
	//freopen("a.in","r",stdin);
	//freopen("z.txt","r",stdin);
	//freopen("a.out","w",stdout);
	#endif
	srand(time(0));
	mine::main();
	//debug("\n------------------------------------------\nTime: %.2lf s\n",1.0*clock()/CLOCKS_PER_SEC);
}


//This file was created by Zory at 2020.04.26 16:00:11
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
// typedef __int128 ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
#define FR first
#define SE second
#define MP make_pair
#define PB push_back
#define vc vector
#define db double
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define bin(x) (1ll<<(x))
#define fo(i,l,r) for(int i=(l),I=(r);i<=I;i++)
#define fd(i,r,l) for(int i=(r),I=(l);i>=I;i--)
#define mem(x,val) memset(x,val,sizeof x)
#define Swap(a,b,n) for(int I=0;I<=n;I++) swap(a[I],b[I])
#define PC __builtin_popcountll
#ifdef DEBUG
	#define debug(A,args...) fprintf(stderr,A,##args)
#else
	#define debug(A,args...) printf("")
#endif
#define deb debug("line %d\n",__LINE__)
namespace mine
{
	ll qread()
	{
		ll ans=0,f=1;char c=getchar();
		while(c<'0' or c>'9') {if(c=='-')f=-1;c=getchar();}
		while('0'<=c and c<='9') ans=ans*10+c-'0',c=getchar();
		return ans*f;
	}
	void write(ll num){if(num<0) putchar('-'),num=-num;if(num>=10) write(num/10);putchar('0'+num%10);}
	void write1(ll num){write(num);putchar(' ');}
	void write2(ll num){write(num);putchar('\n');}
	template<typename T>inline bool chmax(T&a,const T&b){return a<b?a=b,1:0;}
	template<typename T>inline bool chmin(T&a,const T&b){return a>b?a=b,1:0;}
	ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
	bool IN(ll x,ll l,ll r){return l<=x and x<=r;}
	void GG(){puts("-1");exit(0);}

	const db eps=1e-8;
	const int INF=0x3f3f3f3f;
	const int MOD=998244353;
	int mm(const int x){return x>=MOD?x-MOD:x;}
	template<typename T> void add(T &x,const int &y){x=(x+y>=MOD?x+y-MOD:x+y);}
	ll qpower(ll x,ll e,int mod=MOD){ll ans=1;while(e){if(e&1)ans=ans*x%mod;x=x*x%mod;e>>=1;}return ans;}
	ll invm(ll x){return qpower(x,MOD-2);}
	const int MM=5e6+10;
	ll fac[MM],facinv[MM],Inv[MM];ll Comb(int n,int m){return n<0 or n<m?0:fac[n]*facinv[m]%MOD*facinv[n-m]%MOD;}
	void PRE()
	{
		fac[0]=1;fo(i,1,MM-1) fac[i]=fac[i-1]*i%MOD;
		facinv[MM-1]=invm(fac[MM-1]);fd(i,MM-1,1) facinv[i-1]=facinv[i]*i%MOD;
		Inv[1]=1;fo(i,2,MM-1) Inv[i]=(MOD-MOD/i)*Inv[MOD%i]%MOD;
	}
	const int N=1e6+10;
	//------------------FIXED------------------
	int ans[N];pii ret[N];
	pii ask(int i){ printf("+ %d\n",i),fflush(stdout);int A=qread(),B=qread();return {A,B}; }
	void main()
	{
		int n=qread();ret[0].FR=qread(),ret[0].SE=qread();
		fd(i,n-1,3) ret[i]=ask(i);ret[1]=ask(1),ret[2]=ask(2);
		pii now=ask(1);ans[1]=sqrt((now.FR-ret[2].FR)*2)-1;
		ans[3]=(now.SE-ret[2].SE)-(ret[1].SE-ret[3].SE)-1,ans[2]=(ret[1].SE-ret[3].SE)/(ans[3]+1);
		ans[2+2]=(ret[2].SE-ret[1].SE)/(ans[3]+1)-(ans[1]+1)-1;
		fo(i,3,n-2) ans[i+2]=(ret[i].SE-ret[i+1].SE-ans[i-2]*ans[i-1])/(ans[i+1]+1)-ans[i-1]-1;
		ans[n]++;printf("! ");fo(i,1,n) write1(ans[i]);fflush(stdout);
	}
};//变量重名！
signed main()
{
	#ifdef DEBUG
	//freopen("a.in","r",stdin);
	//freopen("z.txt","r",stdin);
	//freopen("a.out","w",stdout);
	#endif
	srand(time(0));
	mine::main();
	//debug("\n------------------------------------------\nTime: %.2lf s\n",1.0*clock()/CLOCKS_PER_SEC);
}


//This file was created by Zory at 2020.04.26 16:00:11
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
// typedef __int128 ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
#define FR first
#define SE second
#define MP make_pair
#define PB push_back
#define vc vector
#define db double
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define bin(x) (1ll<<(x))
#define fo(i,l,r) for(int i=(l),I=(r);i<=I;i++)
#define fd(i,r,l) for(int i=(r),I=(l);i>=I;i--)
#define mem(x,val) memset(x,val,sizeof x)
#define Swap(a,b,n) for(int I=0;I<=n;I++) swap(a[I],b[I])
#define PC __builtin_popcountll
#ifdef DEBUG
	#define debug(A,args...) fprintf(stderr,A,##args)
#else
	#define debug(A,args...) printf("")
#endif
#define deb debug("line %d\n",__LINE__)
namespace mine
{
	ll qread()
	{
		ll ans=0,f=1;char c=getchar();
		while(c<'0' or c>'9') {if(c=='-')f=-1;c=getchar();}
		while('0'<=c and c<='9') ans=ans*10+c-'0',c=getchar();
		return ans*f;
	}
	void write(ll num){if(num<0) putchar('-'),num=-num;if(num>=10) write(num/10);putchar('0'+num%10);}
	void write1(ll num){write(num);putchar(' ');}
	void write2(ll num){write(num);putchar('\n');}
	template<typename T>inline bool chmax(T&a,const T&b){return a<b?a=b,1:0;}
	template<typename T>inline bool chmin(T&a,const T&b){return a>b?a=b,1:0;}
	ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
	bool IN(ll x,ll l,ll r){return l<=x and x<=r;}
	void GG(){puts("-1");exit(0);}

	const db eps=1e-8;
	const int INF=0x3f3f3f3f;
	const int MOD=998244353;
	int mm(const int x){return x>=MOD?x-MOD:x;}
	template<typename T> void add(T &x,const int &y){x=(x+y>=MOD?x+y-MOD:x+y);}
	ll qpower(ll x,ll e,int mod=MOD){ll ans=1;while(e){if(e&1)ans=ans*x%mod;x=x*x%mod;e>>=1;}return ans;}
	ll invm(ll x){return qpower(x,MOD-2);}
	const int MM=5e6+10;
	ll fac[MM],facinv[MM],Inv[MM];ll Comb(int n,int m){return n<0 or n<m?0:fac[n]*facinv[m]%MOD*facinv[n-m]%MOD;}
	void PRE()
	{
		fac[0]=1;fo(i,1,MM-1) fac[i]=fac[i-1]*i%MOD;
		facinv[MM-1]=invm(fac[MM-1]);fd(i,MM-1,1) facinv[i-1]=facinv[i]*i%MOD;
		Inv[1]=1;fo(i,2,MM-1) Inv[i]=(MOD-MOD/i)*Inv[MOD%i]%MOD;
	}
	const int N=1e6+10;
	//------------------FIXED------------------
	int ans[N],go[N];pii ret[N];
	pii ask(int i){printf("+ %d\n",i),fflush(stdout);int A=qread(),B=qread();return {A,B};}
	void main()
	{
		fo(i,1,100) go[i*(i-1)/2]=i;
		int n=qread();ret[0].FR=qread(),ret[0].SE=qread();
		fd(i,n-1,3) ret[i]=ask(i);ret[1]=ask(1),ret[2]=ask(2);
		pii now=ask(1);ans[1]=go[now.FR-ret[2].FR]-1;
		ans[3]=now.SE-ret[1].SE-1,ans[2]=(now.SE-ret[2].SE)/(ans[3]+1);
		fo(i,2,n-2) ans[i+2]=(ret[i].SE-ret[i+1].SE-ans[i-2]*ans[i-1]-ans[i-1]*(ans[i+1]+1))/(ans[i+1]+1)-1;ans[n]++;
		printf("! ");fo(i,1,n) write1(ans[i]);fflush(stdout);
	}
};//变量重名！
signed main()
{
	#ifdef DEBUG
	//freopen("a.in","r",stdin);
	//freopen("z.txt","r",stdin);
	//freopen("a.out","w",stdout);
	#endif
	srand(time(0));
	mine::main();
	//debug("\n------------------------------------------\nTime: %.2lf s\n",1.0*clock()/CLOCKS_PER_SEC);
}


//This file was created by Zory at 2020.04.26 16:00:11
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
// typedef __int128 ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
#define FR first
#define SE second
#define MP make_pair
#define PB push_back
#define vc vector
#define db double
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define bin(x) (1ll<<(x))
#define fo(i,l,r) for(int i=(l),I=(r);i<=I;i++)
#define fd(i,r,l) for(int i=(r),I=(l);i>=I;i--)
#define mem(x,val) memset(x,val,sizeof x)
#define Swap(a,b,n) for(int I=0;I<=n;I++) swap(a[I],b[I])
#define PC __builtin_popcountll
#ifdef DEBUG
	#define debug(A,args...) fprintf(stderr,A,##args)
#else
	#define debug(A,args...) printf("")
#endif
#define deb debug("line %d\n",__LINE__)
namespace mine
{
	ll qread()
	{
		ll ans=0,f=1;char c=getchar();
		while(c<'0' or c>'9') {if(c=='-')f=-1;c=getchar();}
		while('0'<=c and c<='9') ans=ans*10+c-'0',c=getchar();
		return ans*f;
	}
	void write(ll num){if(num<0) putchar('-'),num=-num;if(num>=10) write(num/10);putchar('0'+num%10);}
	void write1(ll num){write(num);putchar(' ');}
	void write2(ll num){write(num);putchar('\n');}
	template<typename T>inline bool chmax(T&a,const T&b){return a<b?a=b,1:0;}
	template<typename T>inline bool chmin(T&a,const T&b){return a>b?a=b,1:0;}
	ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
	bool IN(ll x,ll l,ll r){return l<=x and x<=r;}
	void GG(){puts("-1");exit(0);}

	const db eps=1e-8;
	const int INF=0x3f3f3f3f;
	const int MOD=998244353;
	int mm(const int x){return x>=MOD?x-MOD:x;}
	template<typename T> void add(T &x,const int &y){x=(x+y>=MOD?x+y-MOD:x+y);}
	ll qpower(ll x,ll e,int mod=MOD){ll ans=1;while(e){if(e&1)ans=ans*x%mod;x=x*x%mod;e>>=1;}return ans;}
	ll invm(ll x){return qpower(x,MOD-2);}
	const int MM=5e6+10;
	ll fac[MM],facinv[MM],Inv[MM];ll Comb(int n,int m){return n<0 or n<m?0:fac[n]*facinv[m]%MOD*facinv[n-m]%MOD;}
	void PRE()
	{
		fac[0]=1;fo(i,1,MM-1) fac[i]=fac[i-1]*i%MOD;
		facinv[MM-1]=invm(fac[MM-1]);fd(i,MM-1,1) facinv[i-1]=facinv[i]*i%MOD;
		Inv[1]=1;fo(i,2,MM-1) Inv[i]=(MOD-MOD/i)*Inv[MOD%i]%MOD;
	}
	const int N=1e6+10;
	//------------------FIXED------------------
	int ans[N],c[N],go[N];
	void main()
	{
		fo(i,1,100) go[i*(i-1)/2]=i;
		int n=qread(),lstA=qread(),lstB=qread();
		bool is0;
		fo(i,1,n-1)//i前面已知，且c[i]是否是0已知
		{
			printf("+ %d\n",i),fflush(stdout);int A=qread(),B=qread();
			if(i==1 and A==lstA){ if(ans[i]<0) ans[i]=0,c[i]=2; else ans[i]--,i--; }//最多两次
			else if(is0) ans[i]=0,c[i]=1;
			else ans[i]+=go[A-lstA],c[i]=go[A-lstA]+1;
			is0=(B-lstB-(i>=3?c[i-2]*c[i-1]:0)==0 and i+2<=n);lstA=A,lstB=B;
		}
		fo(i,2,n-2) lstB-=c[i-1]*c[i]*c[i+1];assert(lstB%(c[n-2]*c[n-1])==0);ans[n]=lstB/c[n-2]/c[n-1];
		printf("! ");fo(i,1,n) write1(ans[i]);fflush(stdout);
	}
};//变量重名！
signed main()
{
	#ifdef DEBUG
	//freopen("a.in","r",stdin);
	//freopen("z.txt","r",stdin);
	//freopen("a.out","w",stdout);
	#endif
	srand(time(0));
	mine::main();
	//debug("\n------------------------------------------\nTime: %.2lf s\n",1.0*clock()/CLOCKS_PER_SEC);
}


//This file was created by Zory at 2020.04.26 16:00:11
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
// typedef __int128 ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
#define FR first
#define SE second
#define MP make_pair
#define PB push_back
#define vc vector
#define db double
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define bin(x) (1ll<<(x))
#define fo(i,l,r) for(int i=(l),I=(r);i<=I;i++)
#define fd(i,r,l) for(int i=(r),I=(l);i>=I;i--)
#define mem(x,val) memset(x,val,sizeof x)
#define Swap(a,b,n) for(int I=0;I<=n;I++) swap(a[I],b[I])
#define PC __builtin_popcountll
#ifdef DEBUG
	#define debug(A,args...) fprintf(stderr,A,##args)
#else
	#define debug(A,args...) printf("")
#endif
#define deb debug("line %d\n",__LINE__)
namespace mine
{
	ll qread()
	{
		ll ans=0,f=1;char c=getchar();
		while(c<'0' or c>'9') {if(c=='-')f=-1;c=getchar();}
		while('0'<=c and c<='9') ans=ans*10+c-'0',c=getchar();
		return ans*f;
	}
	void write(ll num){if(num<0) putchar('-'),num=-num;if(num>=10) write(num/10);putchar('0'+num%10);}
	void write1(ll num){write(num);putchar(' ');}
	void write2(ll num){write(num);putchar('\n');}
	template<typename T>inline bool chmax(T&a,const T&b){return a<b?a=b,1:0;}
	template<typename T>inline bool chmin(T&a,const T&b){return a>b?a=b,1:0;}
	ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
	bool IN(ll x,ll l,ll r){return l<=x and x<=r;}
	void GG(){puts("-1");exit(0);}

	const db eps=1e-8;
	const int INF=0x3f3f3f3f;
	const int MOD=998244353;
	int mm(const int x){return x>=MOD?x-MOD:x;}
	template<typename T> void add(T &x,const int &y){x=(x+y>=MOD?x+y-MOD:x+y);}
	ll qpower(ll x,ll e,int mod=MOD){ll ans=1;while(e){if(e&1)ans=ans*x%mod;x=x*x%mod;e>>=1;}return ans;}
	ll invm(ll x){return qpower(x,MOD-2);}
	const int MM=5e6+10;
	ll fac[MM],facinv[MM],Inv[MM];ll Comb(int n,int m){return n<0 or n<m?0:fac[n]*facinv[m]%MOD*facinv[n-m]%MOD;}
	void PRE()
	{
		fac[0]=1;fo(i,1,MM-1) fac[i]=fac[i-1]*i%MOD;
		facinv[MM-1]=invm(fac[MM-1]);fd(i,MM-1,1) facinv[i-1]=facinv[i]*i%MOD;
		Inv[1]=1;fo(i,2,MM-1) Inv[i]=(MOD-MOD/i)*Inv[MOD%i]%MOD;
	}
	const int N=1e6+10;
	//------------------FIXED------------------
	int ans[N],c[N],go[N];
	void main()
	{
		fo(i,1,100) go[i*(i-1)/2]=i;
		int n=qread(),lstA=qread(),lstB=qread();
		bool is0=0;//对于i=1，只会在变大时使用is0
		fo(i,1,n-1)//i前面已知，且c[i]是否是0已知
		{
			printf("+ %d\n",i),fflush(stdout);int A=qread(),B=qread();
			if(i==1 and A==lstA){ if(ans[i]<0) ans[i]=0,c[i]=2; else ans[i]--,i--; }//最多两次
			else if(is0) ans[i]=0,c[i]=1;
			else ans[i]+=go[A-lstA],c[i]=go[A-lstA]+1;
			is0=(B-lstB-(i>=3?c[i-2]*c[i-1]:0)==0 and i+2<=n);lstA=A,lstB=B;
		}
		fo(i,2,n-2) lstB-=c[i-1]*c[i]*c[i+1];assert(lstB%(c[n-2]*c[n-1])==0);ans[n]=lstB/c[n-2]/c[n-1];
		printf("! ");fo(i,1,n) write1(ans[i]);fflush(stdout);
	}
};//变量重名！
signed main()
{
	#ifdef DEBUG
	//freopen("a.in","r",stdin);
	//freopen("z.txt","r",stdin);
	//freopen("a.out","w",stdout);
	#endif
	srand(time(0));
	mine::main();
	//debug("\n------------------------------------------\nTime: %.2lf s\n",1.0*clock()/CLOCKS_PER_SEC);
}


//This file was created by Zory at 2020.04.26 16:00:11
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
// typedef __int128 ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
#define FR first
#define SE second
#define MP make_pair
#define PB push_back
#define vc vector
#define db double
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define bin(x) (1ll<<(x))
#define fo(i,l,r) for(int i=(l),I=(r);i<=I;i++)
#define fd(i,r,l) for(int i=(r),I=(l);i>=I;i--)
#define mem(x,val) memset(x,val,sizeof x)
#define Swap(a,b,n) for(int I=0;I<=n;I++) swap(a[I],b[I])
#define PC __builtin_popcountll
#ifdef DEBUG
	#define debug(A,args...) fprintf(stderr,A,##args)
#else
	#define debug(A,args...) printf("")
#endif
#define deb debug("line %d\n",__LINE__)
namespace mine
{
	ll qread()
	{
		ll ans=0,f=1;char c=getchar();
		while(c<'0' or c>'9') {if(c=='-')f=-1;c=getchar();}
		while('0'<=c and c<='9') ans=ans*10+c-'0',c=getchar();
		return ans*f;
	}
	void write(ll num){if(num<0) putchar('-'),num=-num;if(num>=10) write(num/10);putchar('0'+num%10);}
	void write1(ll num){write(num);putchar(' ');}
	void write2(ll num){write(num);putchar('\n');}
	template<typename T>inline bool chmax(T&a,const T&b){return a<b?a=b,1:0;}
	template<typename T>inline bool chmin(T&a,const T&b){return a>b?a=b,1:0;}
	ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
	bool IN(ll x,ll l,ll r){return l<=x and x<=r;}
	void GG(){puts("-1");exit(0);}

	const db eps=1e-8;
	const int INF=0x3f3f3f3f;
	const int MOD=998244353;
	int mm(const int x){return x>=MOD?x-MOD:x;}
	template<typename T> void add(T &x,const int &y){x=(x+y>=MOD?x+y-MOD:x+y);}
	ll qpower(ll x,ll e,int mod=MOD){ll ans=1;while(e){if(e&1)ans=ans*x%mod;x=x*x%mod;e>>=1;}return ans;}
	ll invm(ll x){return qpower(x,MOD-2);}
	const int MM=5e6+10;
	ll fac[MM],facinv[MM],Inv[MM];ll Comb(int n,int m){return n<0 or n<m?0:fac[n]*facinv[m]%MOD*facinv[n-m]%MOD;}
	void PRE()
	{
		fac[0]=1;fo(i,1,MM-1) fac[i]=fac[i-1]*i%MOD;
		facinv[MM-1]=invm(fac[MM-1]);fd(i,MM-1,1) facinv[i-1]=facinv[i]*i%MOD;
		Inv[1]=1;fo(i,2,MM-1) Inv[i]=(MOD-MOD/i)*Inv[MOD%i]%MOD;
	}
	const int N=1e6+10;
	//------------------FIXED------------------
	int ans[N];pii ret[N];
	pii ask(int i){ printf("+ %d\n",i),fflush(stdout);int A=qread(),B=qread();return {A,B}; }
	void main()
	{
		int n=qread();ret[0].FR=qread(),ret[0].SE=qread();
		fd(i,n-1,3) ret[i]=ask(i);ret[1]=ask(1),ret[2]=ask(2);
		pii now=ask(1);ans[1]=sqrt((now.FR-ret[2].FR)*2);
		ans[3]=(now.SE-ret[2].SE)-(ret[1].SE-ret[3].SE)-1,ans[2]=(ret[1].SE-ret[3].SE)/(ans[3]+1);
		ans[2+2]=(ret[2].SE-ret[1].SE)/(ans[3]+1)-(ans[1]+1)-1;
		fo(i,3,n-2) ans[i+2]=(ret[i].SE-ret[i+1].SE-ans[i-2]*ans[i-1])/(ans[i+1]+1)-ans[i-1]-1;
		ans[n]++;printf("! ");fo(i,1,n) write1(ans[i]);fflush(stdout);
	}
};//变量重名！
signed main()
{
	#ifdef DEBUG
	//freopen("a.in","r",stdin);
	//freopen("z.txt","r",stdin);
	//freopen("a.out","w",stdout);
	#endif
	srand(time(0));
	mine::main();
	//debug("\n------------------------------------------\nTime: %.2lf s\n",1.0*clock()/CLOCKS_PER_SEC);
}


//https://codeforces.com/contest/1336/problem/D
#include <bits/stdc++.h>
using namespace std;
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
#define M1 1000000007
#define M2 998244353
#define ll long long
#define pll pair<ll,ll>
#define REP(i,a,b) for(ll i=a;i<b;i++)
#define REPI(i,a,b) for(ll i=b-1;i>=a;i--)
#define F first
#define S second
#define PB push_back
#define DB pop_back
#define MP make_pair
#define MT make_tuple
#define G(a,b) get<a>(b)
#define V(a) vector<a>

template<typename T>
#define o_set(T) tree<T, null_type,less<T>, rb_tree_tag,tree_order_statistics_node_update>
//member functions :
//1. order_of_key(k) : number of elements strictly lesser than k
//2. find_by_order(k) : k-th element in the set

ll modI(ll a,ll m);
ll gcd(ll a,ll b);
ll powM(ll x,ll y,ll m);
template<typename T>
void pairsort(T a[],T b[],ll n);
ll logint(ll x,ll y);
void Miden(ll **p1,ll n);
void Mmult(ll **p1,ll **p2,ll **ans,ll x,ll y,ll z,ll m);
void Mpow(ll **p1,ll **ans,ll n,ll y,ll m);
pll Egcd(ll x,ll y);
ll PrimRoot(ll n,ll x);
void fft(ll a[],ll n,bool invert,ll m,ll x);
V(ll) PolyMult(V(ll) &a,V(ll) &b,ll m,ll x);
ll fn(ll x,ll rn[]);
bool un(ll x,ll y,ll rn[],ll sz[]);
void build(ll v,ll tl,ll tr,ll st[],ll lz[],bool f[],ll a[]);
void push(ll v,ll tl,ll tr,ll st[],ll lz[],bool f[]);
void update(ll v,ll tl,ll tr,ll l,ll r,ll val,bool set,ll st[],ll lz[],bool f[]);
ll query(ll v,ll tl,ll tr,ll l,ll r,ll st[],ll lz[],bool f[]);

ll gcd(ll x,ll y)
{
    if(x==0) return y;
    return gcd(y%x,x);
}

pll Egcd(ll x,ll y)
{
    if(x==0) return MP(0,1);
    pll t=Egcd(y%x,x);
    return MP(t.S-t.F*(y/x),t.F);
}

ll powM(ll x,ll y,ll m)
{
    ll ans=1,r=1;
    x%=m;
    while(r>0&&r<=y)
    {
        if(r&y)
        {
            ans*=x;
            ans%=m;
        }
        r<<=1;
        x*=x;
        x%=m;
    }
    return ans;
}

ll modI(ll a, ll m)
{
    ll m0=m,y=0,x=1;
    if(m==1) return 0;
    while(a>1)
    {
        ll q=a/m;
        ll t=m;
        m=a%m;
        a=t;
        t=y;
        y=x-q*y;
        x=t;
    }
    if(x<0) x+=m0;
    return x;
}

template<typename T>
void pairsort(T a[],T b[],ll n)
{
    pair<T,T> v[n];
    REP(i,0,n)
    {
        v[i].F=a[i];
        v[i].S=b[i];
    }
    sort(v,v+n);
    REP(i,0,n)
    {
        a[i]=v[i].F;
        b[i]=v[i].S;
    }
}

ll logint(ll x,ll y)
{
    ll ans=0;
    ll a=1;
    for(ll i=0;i<=x;i++)
    {
        if(x<a)
        {
            return ans;
        }
        ans++;
        a*=y;
    }
    return -1;
}

void Miden(ll **p1,ll n)
{
    ll (*x)[n]=(ll(*)[n]) p1;
    REP(i,0,n)
    {
        REP(j,0,n)
        {
            x[i][j]=0;
        }
        x[i][i]=1;
    }
    return;
}

void Mmult(ll **p1,ll **p2,ll **ans,ll x,ll y,ll z,ll m)
{
    ll (*a)[y]=(ll (*)[y])p1;
    ll (*b)[z]=(ll (*)[z])p2;
    ll (*c)[z]=(ll (*)[z])ans;
    REP(i,0,x)
    {
        REP(j,0,z)
        {
            c[i][j]=0;
            REP(k,0,y)
            {
                c[i][j]+=a[i][k]*b[k][j];
                c[i][j]%=m;
            }
        }
    }
    return;
}

void Mpow(ll **p1,ll **ans,ll n,ll y,ll m)
{
    if(y==0)
    {
        Miden(ans,n);
        return;
    }
    ll t[n][n];
    Mpow(p1,(ll **)t,n,y/2,m);
    ll z[n][n];
    Mmult((ll **)t,(ll **)t,(ll **)z,n,n,n,m);
    if(y%2)
    {
        Mmult((ll **)z,p1,ans,n,n,n,m);
    }
    else
    {
        Miden((ll **)t,n);
        Mmult((ll **)z,(ll **)t,ans,n,n,n,m);
    }
    return;
}

ll PrimRoot(ll p,ll x)
{
    //finds primitive root of prime p greater than x(If it doesnt exist, returns 0)
    V(ll) v;
    ll t=p-1;
    REP(i,2,t+1)
    {
        if(i*i>t) break;
        if(t%i==0)
        {
            v.PB((p-1)/i);
            while(t%i==0)
            {
                t/=i;
            }
        }
    }
    if(t>1) v.PB((p-1)/t);
    REP(i,x+1,p)
    {
        ll flag=0;
        REP(j,0,v.size())
        {
            if(powM(i,v[j],p)==1)
            {
                flag=1;
                break;
            }
        }
        if(flag==0)
        {
            return i;
        }
    }

    return 0;
}

void fft(ll a[],ll n,bool invert,ll m,ll x)
{
    if(n==1) return;
    ll d[2][n>>1];
    REP(i,0,n/2)
    {
        d[0][i]=a[i<<1];
        d[1][i]=a[(i<<1)+1];
    }
    fft(d[0],n>>1,invert,m,(x*x)%m);
    fft(d[1],n>>1,invert,m,(x*x)%m);
    ll r=1;
    if(invert) x=modI(x,m);
    REP(i,0,n>>1)
    {
        a[i]=(d[0][i]+(r*d[1][i])%m)%m;
        if(a[i]<0) a[i]+=m;
        a[i+(n>>1)]=(d[0][i]-(r*d[1][i])%m)%m;
        if(a[i+(n>>1)]<0) a[i+(n>>1)]+=m;
        r*=x;
        r%=m;
    }
    if(invert)
    {
        ll inv2=modI(2,m);
        REP(i,0,n)
        {
            a[i]=(a[i]*inv2)%m;
        }
    }
    return;
}

V(ll) PolyMult(V(ll) &a,V(ll) &b,ll m,ll x)
{
    ll n=1;
    while(n<a.size()+b.size())
    {
        n<<=1;
    }
    ll fa[n]={};
    ll fb[n]={};
    ll f[n]={};
    REP(i,0,a.size())
    {
        fa[i]=a[i];
    }
    REP(i,0,b.size())
    {
        fb[i]=b[i];
    }
    ll y=powM(x,(m-1)/n,m);
    fft(fa,n,false,m,y);
    fft(fb,n,false,m,y);
    REP(i,0,n)
    {
        f[i]=(fa[i]*fb[i])%m;
    }
    fft(f,n,true,m,y);
    V(ll) v(n);
    REP(i,0,n)
    {
        v[i]=f[i];
    }
    return v;
}

ll fn(ll x,ll rn[])
{
    if(x==rn[x])
        return x;
    else
        return rn[x]=fn(rn[x],rn);
}

bool un(ll x,ll y,ll rn[],ll sz[])
{
    x=fn(x,rn);
    y=fn(y,rn);
    if(x==y)
        return false;
    if(sz[x]<sz[y])
        swap(x,y);
    sz[x]+=sz[y];
    rn[y]=x;
    return true;
}

void build(ll v,ll tl,ll tr,ll st[],ll lz[],bool f[],ll a[])
{
    if(tl==tr)
    {
        st[v]=a[tl];
        lz[v]=0LL;
        f[v]=false;
        return;
    }
    build((v<<1),tl,((tl+tr)>>1),st,lz,f,a);
    build((v<<1)|1,((tl+tr)>>1)+1,tr,st,lz,f,a);
    //operation
    st[v]=st[(v<<1)]+st[(v<<1)|1];
    lz[v]=0LL;
    f[v]=false;
    return;
}

void push(ll v,ll tl,ll tr,ll st[],ll lz[],bool f[])
{
    if(f[v])
    {
        //operation
        st[(v<<1)]=lz[(v<<1)]=st[(v<<1)|1]=lz[(v<<1)|1]=0LL;
        f[(v<<1)]=f[(v<<1)|1]=true;
        f[v]=false;
    }
    //operation
    st[(v<<1)]+=lz[v]*(((tl+tr)>>1)-tl+1);
    //operation
    lz[(v<<1)]+=lz[v];
    //operation
    st[(v<<1)|1]+=lz[v]*(tr-((tl+tr)>>1));
    //operation
    lz[(v<<1)|1]+=lz[v];
    lz[v]=0LL;
    return;
}

void update(ll v,ll tl,ll tr,ll l,ll r,ll val,bool set,ll st[],ll lz[],bool f[])
{
    if(l>r)
    {
        return;
    }
    if(l==tl&&tr==r)
    {
        if(set)
        {
            //operation
            st[v]=lz[v]=0LL;
            f[v]=true;
        }
        //operation
        st[v]+=val*(tr-tl+1);
        //operation
        lz[v]+=val;
        return;
    }
    push(v,tl,tr,st,lz,f);
    update((v<<1),tl,((tl+tr)>>1),l,min(r,((tl+tr)>>1)),val,set,st,lz,f);
    update((v<<1)|1,((tl+tr)>>1)+1,tr,max(l,((tl+tr)>>1)+1),r,val,set,st,lz,f);
    //operation
    st[v]=st[(v<<1)]+st[(v<<1)|1];
    return;
}

ll query(ll v,ll tl,ll tr,ll l,ll r,ll st[],ll lz[],bool f[])
{
    if(l>r)
    {
        return 0LL;
    }
    if(l==tl&&tr==r)
    {
        return st[v];
    }
    push(v,tl,tr,st,lz,f);
    //operation
    return query((v<<1),tl,((tl+tr)>>1),l,min(r,((tl+tr)>>1)),st,lz,f)+query((v<<1)|1,((tl+tr)>>1)+1,tr,max(l,((tl+tr)>>1)+1),r,st,lz,f);
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    ll n,x;
    cin>>n;
    ll t[n+1],s[n+1];
    cin>>t[0]>>s[0];
    REP(i,1,n)
    {
        cout<<'+'<<' '<<i<<endl;
        cin>>t[i]>>s[i];
    }
    cout<<'+'<<' '<<1<<endl;
    cin>>t[n]>>s[n];
    ll ans[n+1];
    REP(i,1,n)
    {
        if(t[i]==t[i-1])
        {
            ans[i]=-1;
        }
        else
        {
            x=t[i]-t[i-1];
            REP(j,2,n+1)
            {
                if(j*(j-1)==2*x)
                {
                    ans[i]=j;
                    break;
                }
            }
        }
    }
    x=t[n]-t[n-1];
    REP(j,1,n+1)
    {
        if(j*(j-1)==2*x)
        {
            ans[1]=j-1;
            break;
        }
    }
    if(ans[3]==-1)
    {
        if(s[2]==s[1])
        {
            ans[3]=0;
        }
        else
        {
            ans[3]=1;
        }
    }
    if(ans[2]==-1) ans[2]=0;
    REP(i,3,n-1)
    {
        if(ans[i+1]==-1)
        {
            x=(ans[i-1]+1)*(ans[i-2]+1);
            if(s[i]==s[i-1]+x)
            {
                ans[i+1]=0;
            }
            else
            {
                ans[i+1]=1;
            }
        }
    }
    x=s[n-1]-s[n-2];
    x-=(ans[n-2]+1)*(ans[n-3]+1);
    x/=(ans[n-2]+1);
    ans[n]=x;
    x=(ans[1]+2)*(ans[2]+1)*(ans[3]+1);
    REP(i,4,n)
    {
        x+=(ans[i-2]+1)*(ans[i-1]+1)*(ans[i]+1);
    }
    x+=(ans[n-2]+1)*(ans[n-1]+1)*(ans[n]);
    if(x!=s[n])
    {
        REP(i,1,n)
        {
            if(t[i]==t[i-1])
            {
                ans[i]=-1;
            }
            else
            {
                x=t[i]-t[i-1];
                REP(j,2,n+1)
                {
                    if(j*(j-1)==2*x)
                    {
                        ans[i]=j;
                        break;
                    }
                }
            }
        }
        x=t[n]-t[n-1];
        REP(j,1,n+1)
        {
            if(j*(j-1)==2*x)
            {
                ans[1]=j-1;
                break;
            }
        }
        if(ans[3]==-1)
        {
            if(s[2]==s[1])
            {
                ans[3]=0;
            }
            else
            {
                ans[3]=1;
            }
        }
        if(ans[2]==-1) ans[2]=1;
        REP(i,3,n-1)
        {
            if(ans[i+1]==-1)
            {
                x=(ans[i-1]+1)*(ans[i-2]+1);
                if(s[i]==s[i-1]+x)
                {
                    ans[i+1]=0;
                }
                else
                {
                    ans[i+1]=1;
                }
            }
        }
        x=s[n-1]-s[n-2];
        x-=(ans[n-2]+1)*(ans[n-3]+1);
        x/=(ans[n-2]+1);
        ans[n]=x;
    }
    cout<<'!'<<' ';
    REP(i,1,n+1)
    {
        cout<<ans[i]<<' ';
    }
    cout<<endl;

    return 0;
}


//https://codeforces.com/contest/1336/problem/D
#include <bits/stdc++.h>
using namespace std;
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
#define M1 1000000007
#define M2 998244353
#define ll long long
#define pll pair<ll,ll>
#define REP(i,a,b) for(ll i=a;i<b;i++)
#define REPI(i,a,b) for(ll i=b-1;i>=a;i--)
#define F first
#define S second
#define PB push_back
#define DB pop_back
#define MP make_pair
#define MT make_tuple
#define G(a,b) get<a>(b)
#define V(a) vector<a>

template<typename T>
#define o_set(T) tree<T, null_type,less<T>, rb_tree_tag,tree_order_statistics_node_update>
//member functions :
//1. order_of_key(k) : number of elements strictly lesser than k
//2. find_by_order(k) : k-th element in the set

ll modI(ll a,ll m);
ll gcd(ll a,ll b);
ll powM(ll x,ll y,ll m);
template<typename T>
void pairsort(T a[],T b[],ll n);
ll logint(ll x,ll y);
void Miden(ll **p1,ll n);
void Mmult(ll **p1,ll **p2,ll **ans,ll x,ll y,ll z,ll m);
void Mpow(ll **p1,ll **ans,ll n,ll y,ll m);
pll Egcd(ll x,ll y);
ll PrimRoot(ll n,ll x);
void fft(ll a[],ll n,bool invert,ll m,ll x);
V(ll) PolyMult(V(ll) &a,V(ll) &b,ll m,ll x);
ll fn(ll x,ll rn[]);
bool un(ll x,ll y,ll rn[],ll sz[]);
void build(ll v,ll tl,ll tr,ll st[],ll lz[],bool f[],ll a[]);
void push(ll v,ll tl,ll tr,ll st[],ll lz[],bool f[]);
void update(ll v,ll tl,ll tr,ll l,ll r,ll val,bool set,ll st[],ll lz[],bool f[]);
ll query(ll v,ll tl,ll tr,ll l,ll r,ll st[],ll lz[],bool f[]);

ll gcd(ll x,ll y)
{
    if(x==0) return y;
    return gcd(y%x,x);
}

pll Egcd(ll x,ll y)
{
    if(x==0) return MP(0,1);
    pll t=Egcd(y%x,x);
    return MP(t.S-t.F*(y/x),t.F);
}

ll powM(ll x,ll y,ll m)
{
    ll ans=1,r=1;
    x%=m;
    while(r>0&&r<=y)
    {
        if(r&y)
        {
            ans*=x;
            ans%=m;
        }
        r<<=1;
        x*=x;
        x%=m;
    }
    return ans;
}

ll modI(ll a, ll m)
{
    ll m0=m,y=0,x=1;
    if(m==1) return 0;
    while(a>1)
    {
        ll q=a/m;
        ll t=m;
        m=a%m;
        a=t;
        t=y;
        y=x-q*y;
        x=t;
    }
    if(x<0) x+=m0;
    return x;
}

template<typename T>
void pairsort(T a[],T b[],ll n)
{
    pair<T,T> v[n];
    REP(i,0,n)
    {
        v[i].F=a[i];
        v[i].S=b[i];
    }
    sort(v,v+n);
    REP(i,0,n)
    {
        a[i]=v[i].F;
        b[i]=v[i].S;
    }
}

ll logint(ll x,ll y)
{
    ll ans=0;
    ll a=1;
    for(ll i=0;i<=x;i++)
    {
        if(x<a)
        {
            return ans;
        }
        ans++;
        a*=y;
    }
    return -1;
}

void Miden(ll **p1,ll n)
{
    ll (*x)[n]=(ll(*)[n]) p1;
    REP(i,0,n)
    {
        REP(j,0,n)
        {
            x[i][j]=0;
        }
        x[i][i]=1;
    }
    return;
}

void Mmult(ll **p1,ll **p2,ll **ans,ll x,ll y,ll z,ll m)
{
    ll (*a)[y]=(ll (*)[y])p1;
    ll (*b)[z]=(ll (*)[z])p2;
    ll (*c)[z]=(ll (*)[z])ans;
    REP(i,0,x)
    {
        REP(j,0,z)
        {
            c[i][j]=0;
            REP(k,0,y)
            {
                c[i][j]+=a[i][k]*b[k][j];
                c[i][j]%=m;
            }
        }
    }
    return;
}

void Mpow(ll **p1,ll **ans,ll n,ll y,ll m)
{
    if(y==0)
    {
        Miden(ans,n);
        return;
    }
    ll t[n][n];
    Mpow(p1,(ll **)t,n,y/2,m);
    ll z[n][n];
    Mmult((ll **)t,(ll **)t,(ll **)z,n,n,n,m);
    if(y%2)
    {
        Mmult((ll **)z,p1,ans,n,n,n,m);
    }
    else
    {
        Miden((ll **)t,n);
        Mmult((ll **)z,(ll **)t,ans,n,n,n,m);
    }
    return;
}

ll PrimRoot(ll p,ll x)
{
    //finds primitive root of prime p greater than x(If it doesnt exist, returns 0)
    V(ll) v;
    ll t=p-1;
    REP(i,2,t+1)
    {
        if(i*i>t) break;
        if(t%i==0)
        {
            v.PB((p-1)/i);
            while(t%i==0)
            {
                t/=i;
            }
        }
    }
    if(t>1) v.PB((p-1)/t);
    REP(i,x+1,p)
    {
        ll flag=0;
        REP(j,0,v.size())
        {
            if(powM(i,v[j],p)==1)
            {
                flag=1;
                break;
            }
        }
        if(flag==0)
        {
            return i;
        }
    }

    return 0;
}

void fft(ll a[],ll n,bool invert,ll m,ll x)
{
    if(n==1) return;
    ll d[2][n>>1];
    REP(i,0,n/2)
    {
        d[0][i]=a[i<<1];
        d[1][i]=a[(i<<1)+1];
    }
    fft(d[0],n>>1,invert,m,(x*x)%m);
    fft(d[1],n>>1,invert,m,(x*x)%m);
    ll r=1;
    if(invert) x=modI(x,m);
    REP(i,0,n>>1)
    {
        a[i]=(d[0][i]+(r*d[1][i])%m)%m;
        if(a[i]<0) a[i]+=m;
        a[i+(n>>1)]=(d[0][i]-(r*d[1][i])%m)%m;
        if(a[i+(n>>1)]<0) a[i+(n>>1)]+=m;
        r*=x;
        r%=m;
    }
    if(invert)
    {
        ll inv2=modI(2,m);
        REP(i,0,n)
        {
            a[i]=(a[i]*inv2)%m;
        }
    }
    return;
}

V(ll) PolyMult(V(ll) &a,V(ll) &b,ll m,ll x)
{
    ll n=1;
    while(n<a.size()+b.size())
    {
        n<<=1;
    }
    ll fa[n]={};
    ll fb[n]={};
    ll f[n]={};
    REP(i,0,a.size())
    {
        fa[i]=a[i];
    }
    REP(i,0,b.size())
    {
        fb[i]=b[i];
    }
    ll y=powM(x,(m-1)/n,m);
    fft(fa,n,false,m,y);
    fft(fb,n,false,m,y);
    REP(i,0,n)
    {
        f[i]=(fa[i]*fb[i])%m;
    }
    fft(f,n,true,m,y);
    V(ll) v(n);
    REP(i,0,n)
    {
        v[i]=f[i];
    }
    return v;
}

ll fn(ll x,ll rn[])
{
    if(x==rn[x])
        return x;
    else
        return rn[x]=fn(rn[x],rn);
}

bool un(ll x,ll y,ll rn[],ll sz[])
{
    x=fn(x,rn);
    y=fn(y,rn);
    if(x==y)
        return false;
    if(sz[x]<sz[y])
        swap(x,y);
    sz[x]+=sz[y];
    rn[y]=x;
    return true;
}

void build(ll v,ll tl,ll tr,ll st[],ll lz[],bool f[],ll a[])
{
    if(tl==tr)
    {
        st[v]=a[tl];
        lz[v]=0LL;
        f[v]=false;
        return;
    }
    build((v<<1),tl,((tl+tr)>>1),st,lz,f,a);
    build((v<<1)|1,((tl+tr)>>1)+1,tr,st,lz,f,a);
    //operation
    st[v]=st[(v<<1)]+st[(v<<1)|1];
    lz[v]=0LL;
    f[v]=false;
    return;
}

void push(ll v,ll tl,ll tr,ll st[],ll lz[],bool f[])
{
    if(f[v])
    {
        //operation
        st[(v<<1)]=lz[(v<<1)]=st[(v<<1)|1]=lz[(v<<1)|1]=0LL;
        f[(v<<1)]=f[(v<<1)|1]=true;
        f[v]=false;
    }
    //operation
    st[(v<<1)]+=lz[v]*(((tl+tr)>>1)-tl+1);
    //operation
    lz[(v<<1)]+=lz[v];
    //operation
    st[(v<<1)|1]+=lz[v]*(tr-((tl+tr)>>1));
    //operation
    lz[(v<<1)|1]+=lz[v];
    lz[v]=0LL;
    return;
}

void update(ll v,ll tl,ll tr,ll l,ll r,ll val,bool set,ll st[],ll lz[],bool f[])
{
    if(l>r)
    {
        return;
    }
    if(l==tl&&tr==r)
    {
        if(set)
        {
            //operation
            st[v]=lz[v]=0LL;
            f[v]=true;
        }
        //operation
        st[v]+=val*(tr-tl+1);
        //operation
        lz[v]+=val;
        return;
    }
    push(v,tl,tr,st,lz,f);
    update((v<<1),tl,((tl+tr)>>1),l,min(r,((tl+tr)>>1)),val,set,st,lz,f);
    update((v<<1)|1,((tl+tr)>>1)+1,tr,max(l,((tl+tr)>>1)+1),r,val,set,st,lz,f);
    //operation
    st[v]=st[(v<<1)]+st[(v<<1)|1];
    return;
}

ll query(ll v,ll tl,ll tr,ll l,ll r,ll st[],ll lz[],bool f[])
{
    if(l>r)
    {
        return 0LL;
    }
    if(l==tl&&tr==r)
    {
        return st[v];
    }
    push(v,tl,tr,st,lz,f);
    //operation
    return query((v<<1),tl,((tl+tr)>>1),l,min(r,((tl+tr)>>1)),st,lz,f)+query((v<<1)|1,((tl+tr)>>1)+1,tr,max(l,((tl+tr)>>1)+1),r,st,lz,f);
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    ll n,x;
    cin>>n;
    ll t[n+1],s[n+1];
    cin>>t[0]>>s[0];
    REP(i,1,n)
    {
        cout<<'+'<<' '<<i<<endl;
        cin>>t[i]>>s[i];
    }
    cout<<'+'<<' '<<1<<endl;
    cin>>t[n]>>s[n];
    ll ans[n+1];
    REP(i,1,n)
    {
        if(t[i]==t[i-1])
        {
            ans[i]=-1;
        }
        else
        {
            x=t[i]-t[i-1];
            REP(j,2,n+1)
            {
                if(j*(j-1)==2*x)
                {
                    ans[i]=j;
                    break;
                }
            }
        }
    }
    x=t[n]-t[n-1];
    REP(j,1,n+1)
    {
        if(j*(j-1)==2*x)
        {
            ans[1]=j-1;
            break;
        }
    }
    if(ans[3]==-1)
    {
        if(s[2]==s[1])
        {
            ans[3]=0;
        }
        else
        {
            ans[3]=1;
        }
    }
    if(ans[2]==-1) ans[2]=0;
    REP(i,3,n-1)
    {
        if(ans[i+1]==-1)
        {
            x=(ans[i-1]+1)*(ans[i-2]+1);
            if(s[i]==s[i-1]+x)
            {
                ans[i+1]=0;
            }
            else
            {
                ans[i+1]=1;
            }
        }
    }
    x=s[n-1]-s[n-2];
    x-=(ans[n-2]+1)*(ans[n-3]+1);
    x/=(ans[n-2]+1);
    ans[n]=x;
    bool flag=true;
    x=0;
    REP(j,3,n+1)
    {
        x+=(ans[j-2])*(ans[j-1])*(ans[j]);
    }
    if(x!=s[0]) flag=false;
    REP(i,1,n)
    {
        x=0;
        ans[i]++;
        REP(j,3,n+1)
        {
            x+=(ans[j-2])*(ans[j-1])*(ans[j]);
        }
        if(x!=s[i]) flag=false;
    }
    x=0;
    ans[1]++;
    REP(j,3,n+1)
    {
        x+=(ans[j-2])*(ans[j-1])*(ans[j]);
    }
    if(x!=s[n]) flag=false;
    if(flag)
    {
        REP(i,1,n) ans[i]--;
        ans[1]--;
    }
    else
    {
        REP(i,1,n)
        {
            if(t[i]==t[i-1])
            {
                ans[i]=-1;
            }
            else
            {
                x=t[i]-t[i-1];
                REP(j,2,n+1)
                {
                    if(j*(j-1)==2*x)
                    {
                        ans[i]=j;
                        break;
                    }
                }
            }
        }
        x=t[n]-t[n-1];
        REP(j,1,n+1)
        {
            if(j*(j-1)==2*x)
            {
                ans[1]=j-1;
                break;
            }
        }
        if(ans[3]==-1)
        {
            if(s[2]==s[1])
            {
                ans[3]=0;
            }
            else
            {
                ans[3]=1;
            }
        }
        if(ans[2]==-1) ans[2]=1;
        REP(i,3,n-1)
        {
            if(ans[i+1]==-1)
            {
                x=(ans[i-1]+1)*(ans[i-2]+1);
                if(s[i]==s[i-1]+x)
                {
                    ans[i+1]=0;
                }
                else
                {
                    ans[i+1]=1;
                }
            }
        }
        x=s[n-1]-s[n-2];
        x-=(ans[n-2]+1)*(ans[n-3]+1);
        x/=(ans[n-2]+1);
        ans[n]=x;
    }
    cout<<'!'<<' ';
    REP(i,1,n+1)
    {
        cout<<ans[i]<<' ';
    }
    cout<<endl;

    return 0;
}


#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define Mp make_pair
#define pb push_back

using ll = long long;
using db = double;
using pii = pair<int, int>;
using vi = vector<int>;

int n, q1[110], q2[110], ans[110], cnt;
signed main(){
    //n-1 ... 3 1 2 1
    cin >> n >> q1[n] >> q2[n];
    for(int i = n - 1; i >= 0; i--) {
        cout << "+ " << (i <= 2 ? i % 2 + 1 : i) << endl;
        cin >> q1[i] >> q2[i];
    }
    for(int i = 0; i <= n - 1; i++) q1[i] -= q1[i + 1], q2[i] -= q2[i + 1];
    // for(int i = 0; i <= n - 1; i++) cout << q1[i] << ' '; cout << '\n';
    // for(int i = 0; i <= n - 1; i++) cout << q2[i] << ' '; cout << '\n';
    ans[1] = (int)ceil(sqrt(2 * q1[0])) - 1;
    ans[3] = q2[0] - q2[2] - 1;
    ans[2] = q2[2] / (ans[3] + 1);
    ans[4] = (q2[1] - (ans[1] + 1) * (ans[3] + 1)) / (ans[3] + 1) - 1;
    for(int i = 3; i <= n - 2; i++) {
        ans[i + 2] = (q2[i] - ans[i - 2] * ans[i - 1] - ans[i - 1] * (ans[i + 1] + 1)) / (ans[i + 1] + 1) - 1;
    } cout << '!'; ans[n]++;
    for(int i = 1; i <= n; i++) cout << ' ' << ans[i]; cout << '\n';
    fprintf(stderr, "time=%.4f\n", (db)clock()/CLOCKS_PER_SEC);
    return 0;
    /* 取模直接除，爆零两行泪
     * 不开ll见祖宗
     */
}


#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define Mp make_pair
#define pb push_back

using ll = long long;
using db = double;
using pii = pair<int, int>;
using vi = vector<int>;

int n, q1[110], q2[110], ans[110], cnt;
signed main(){
    //n-1 ... 3 1 2 1
    cin >> n >> q1[n] >> q2[n];
    for(int i = n - 1; i >= 0; i--) {
        cout << "+ " << (i <= 2 ? i % 2 + 1 : i) << endl;
        cin >> q1[i] >> q2[i];
    }
    for(int i = 0; i <= n - 1; i++) q1[i] -= q1[i + 1], q2[i] -= q2[i + 1];
    for(int i = 0; i <= n - 1; i++) cout << q1[i] << ' '; cout << '\n';
    for(int i = 0; i <= n - 1; i++) cout << q2[i] << ' '; cout << '\n';
    ans[1] = (int)ceil(sqrt(2 * q1[0])) - 1;
    ans[3] = q2[0] - q2[2] - 1;
    ans[2] = q2[2] / (ans[3] + 1);
    ans[4] = (q2[1] - (ans[1] + 1) * (ans[3] + 1)) / (ans[3] + 1) - 1;
    for(int i = 3; i <= n - 2; i++) {
        ans[i + 2] = (q2[i] - ans[i - 2] * ans[i - 1] - ans[i - 1] * (ans[i + 1] + 1)) / (ans[i + 1] + 1) - 1;
    } cout << '!'; ans[n]++;
    for(int i = 1; i <= n; i++) cout << ' ' << ans[i]; cout << '\n';
    fprintf(stderr, "time=%.4f\n", (db)clock()/CLOCKS_PER_SEC);
    return 0;
    /* 取模直接除，爆零两行泪
     * 不开ll见祖宗
     */
}


#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define Mp make_pair
#define pb push_back

using ll = long long;
using db = double;
using pii = pair<int, int>;
using vi = vector<int>;

int n, q1[110], q2[110], ans[110], cnt;
signed main(){
    //n-1 ... 3 1 2 1
    cin >> n >> q1[n] >> q2[n];
    for(int i = n - 1; i >= 0; i--) {
        cout << "+ " << (i <= 2 ? i % 2 + 1 : i) << endl;
        cin >> q1[i] >> q2[i];
    }
    for(int i = 0; i <= n - 1; i++) q1[i] -= q1[i + 1], q2[i] -= q2[i + 1];
    // for(int i = 0; i <= n - 1; i++) cout << q1[i] << ' '; cout << '\n';
    // for(int i = 0; i <= n - 1; i++) cout << q2[i] << ' '; cout << '\n';
    ans[1] = q1[0] == 0 ? 0 : (int)ceil(sqrt(2 * q1[0])) - 1;
    ans[3] = q2[0] - q2[2] - 1;
    ans[2] = q2[2] / (ans[3] + 1);
    ans[4] = (q2[1] - (ans[1] + 1) * (ans[3] + 1)) / (ans[3] + 1) - 1;
    for(int i = 3; i <= n - 2; i++) {
        ans[i + 2] = (q2[i] - ans[i - 2] * ans[i - 1] - ans[i - 1] * (ans[i + 1] + 1)) / (ans[i + 1] + 1) - 1;
    } cout << '!'; ans[n]++;
    for(int i = 1; i <= n; i++) cout << ' ' << ans[i]; cout << '\n';
    fprintf(stderr, "time=%.4f\n", (db)clock()/CLOCKS_PER_SEC);
    return 0;
    /* 取模直接除，爆零两行泪
     * 不开ll见祖宗
     */
}


/*
    author:  Maksim1744
    created: 15.04.2020 19:12:54
*/

#include <bits/stdc++.h>

using namespace std;

#define ll   long long
#define ld   long double

#define mp   make_pair
#define pb   push_back
#define eb   emplace_back

#define sum(a)     ( accumulate ((a).begin(), (a).end(), 0ll))
#define mine(a)    (*min_element((a).begin(), (a).end()))
#define maxe(a)    (*max_element((a).begin(), (a).end()))
#define mini(a)    ( min_element((a).begin(), (a).end()) - (a).begin())
#define maxi(a)    ( max_element((a).begin(), (a).end()) - (a).begin())
#define lowb(a, x) ( lower_bound((a).begin(), (a).end(), (x)) - (a).begin())
#define uppb(a, x) ( upper_bound((a).begin(), (a).end(), (x)) - (a).begin())

template<typename T>             vector<T>& operator--            (vector<T>& v){for (auto& i : v) --i;            return  v;}
template<typename T>             vector<T>& operator++            (vector<T>& v){for (auto& i : v) ++i;            return  v;}
template<typename T>             istream& operator>>(istream& is,  vector<T>& v){for (auto& i : v) is >> i;        return is;}
template<typename T>             ostream& operator<<(ostream& os,  vector<T>& v){for (auto& i : v) os << i << ' '; return os;}
template<typename T, typename U> istream& operator>>(istream& is, pair<T, U>& p){is >> p.first >> p.second;        return is;}
template<typename T, typename U> ostream& operator<<(ostream& os, pair<T, U>& p){os << p.first << ' ' << p.second; return os;}
template<typename T, typename U> pair<T,U> operator-(pair<T,U> a, pair<T,U> b){return mp(a.first-b.first, a.second-b.second);}
template<typename T, typename U> pair<T,U> operator+(pair<T,U> a, pair<T,U> b){return mp(a.first+b.first, a.second+b.second);}
template<typename T, typename U> void umin(T& a, U b){if (a > b) a = b;}
template<typename T, typename U> void umax(T& a, U b){if (a < b) a = b;}

#ifdef HOME
#define TAG_LENGTH       25
#define LR_LEFT          left
#define LR_RIGHT         right
#define LR_VALUE         value
#define LR_SECOND_VALUE  mn
#include "C:/C++ libs/print.cpp"
#else
#define showl            42;
#define shows            42;
#define show(...)        42;
#define showm(...)       42;
#define showt(...)       42;
#define printTree(...)   42;
#define printGraph(...)  42;
#define printLRTree(...) 42;
#define printMatrix(...) 42;
#define printWGraph(...) 42;
#define debug     if (false)
#endif

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);

    int n;
    cin >> n;
    vector<int> v = {1, 2, 3, 1};
    for (int i = 0; i < n - 4; ++i) {
        v.pb(v.size());
    }
    vector<int> ans1(n + 1), ans2(n + 1);
    cin >> ans1[0] >> ans2[0];
    for (int i = 0; i < n; ++i) {
        cout << "+ " << v[i] << endl;
        cin >> ans1[i + 1] >> ans2[i + 1];
    }
    vector<int> c(n + 1, 0);
    if (ans2[2] != ans2[1]) {
        // c3 != 0
        if (ans1[2] == ans1[3]) {
            c[3] = 2;
        } else {
            while (c[3] * (c[3] - 1) / 2 != ans1[3] - ans1[2])
                ++c[3];
            ++c[3];
        }
    } else {
        c[3] = 1;
    }
    c[2] = (ans2[4] - ans2[3]) / c[3];
    c[1] = 0;
    while (c[1] * (c[1] - 1) / 2 != ans1[4] - ans1[3])
        ++c[1];
    ++c[1];

    if (n == 4) {
        c[4] = ((ans2[3] - ans2[2]) - (c[1] - 1) * c[2]) / c[2];
    } else {
        if (ans2[3] == ans2[2] + c[2] * (c[1] - 1)) {
            c[4] = 1;
        } else {
            if (ans1[5] == ans1[4])
                c[4] = 2;
            else {
                c[4] = 0;
                while (c[4] * (c[4] - 1) / 2 != ans1[5] - ans1[4])
                    ++c[4];
                ++c[4];
            }
        }
    }
    for (int i = 5; i <= n; ++i) {
        if (i == n) {
            c[i] = ((ans2[n] - ans2[n - 1]) - c[i - 2] * c[i - 3]) / c[i - 2];
            break;
        }
        if (ans2[i] == ans2[i - 1] + c[i - 2] * c[i - 3]) {
            c[i] = 1;
        } else {
            if (ans1[i + 1] == ans1[i])
                c[i] = 2;
            else {
                c[i] = 0;
                while (c[i] * (c[i] - 1) / 2 != ans1[i + 1] - ans1[i])
                    ++c[i];
                ++c[i];
            }
        }
    }

    c[1]--;
    c[n]++;
    cout << "!";
    for (int i = 0; i < n; ++i) {
        cout << ' ' << c[i + 1] - 1;
    }
    cout << endl;

    return 0;
}


/*
    author:  Maksim1744
    created: 15.04.2020 19:12:54
*/

#include <bits/stdc++.h>

using namespace std;

#define ll   long long
#define ld   long double

#define mp   make_pair
#define pb   push_back
#define eb   emplace_back

#define sum(a)     ( accumulate ((a).begin(), (a).end(), 0ll))
#define mine(a)    (*min_element((a).begin(), (a).end()))
#define maxe(a)    (*max_element((a).begin(), (a).end()))
#define mini(a)    ( min_element((a).begin(), (a).end()) - (a).begin())
#define maxi(a)    ( max_element((a).begin(), (a).end()) - (a).begin())
#define lowb(a, x) ( lower_bound((a).begin(), (a).end(), (x)) - (a).begin())
#define uppb(a, x) ( upper_bound((a).begin(), (a).end(), (x)) - (a).begin())

template<typename T>             vector<T>& operator--            (vector<T>& v){for (auto& i : v) --i;            return  v;}
template<typename T>             vector<T>& operator++            (vector<T>& v){for (auto& i : v) ++i;            return  v;}
template<typename T>             istream& operator>>(istream& is,  vector<T>& v){for (auto& i : v) is >> i;        return is;}
template<typename T>             ostream& operator<<(ostream& os,  vector<T>& v){for (auto& i : v) os << i << ' '; return os;}
template<typename T, typename U> istream& operator>>(istream& is, pair<T, U>& p){is >> p.first >> p.second;        return is;}
template<typename T, typename U> ostream& operator<<(ostream& os, pair<T, U>& p){os << p.first << ' ' << p.second; return os;}
template<typename T, typename U> pair<T,U> operator-(pair<T,U> a, pair<T,U> b){return mp(a.first-b.first, a.second-b.second);}
template<typename T, typename U> pair<T,U> operator+(pair<T,U> a, pair<T,U> b){return mp(a.first+b.first, a.second+b.second);}
template<typename T, typename U> void umin(T& a, U b){if (a > b) a = b;}
template<typename T, typename U> void umax(T& a, U b){if (a < b) a = b;}

#ifdef HOME
#define TAG_LENGTH       25
#define LR_LEFT          left
#define LR_RIGHT         right
#define LR_VALUE         value
#define LR_SECOND_VALUE  mn
#include "C:/C++ libs/print.cpp"
#else
#define showl            42;
#define shows            42;
#define show(...)        42;
#define showm(...)       42;
#define showt(...)       42;
#define printTree(...)   42;
#define printGraph(...)  42;
#define printLRTree(...) 42;
#define printMatrix(...) 42;
#define printWGraph(...) 42;
#define debug     if (false)
#endif

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);

    int n;
    cin >> n;
    vector<int> v = {1, 2, 3, 1};
    for (int i = 0; i < n - 4; ++i) {
        v.pb(v.size());
    }
    vector<int> ans1(n + 1), ans2(n + 1);
    cin >> ans1[0] >> ans2[0];
    for (int i = 0; i < n; ++i) {
        cout << "+ " << v[i] << endl;
        cin >> ans1[i + 1] >> ans2[i + 1];
    }
    vector<int> c(n + 1, 0);
    if (ans2[2] != ans2[1]) {
        // c3 != 0
        if (ans1[2] == ans1[3]) {
            c[3] = 2;
        } else {
            while (c[3] * (c[3] - 1) / 2 != ans1[3] - ans1[2])
                ++c[3];
            ++c[3];
        }
    } else {
        c[3] = 1;
    }
    c[2] = (ans2[4] - ans2[3]) / c[3];
    c[1] = 0;
    while (c[1] * (c[1] - 1) / 2 != ans1[4] - ans1[3])
        ++c[1];
    ++c[1];

    if (n == 4) {
        c[4] = ((ans2[3] - ans2[2]) - (c[1] - 1) * c[2]) / c[2];
        c[4]++;
    } else {
        if (ans2[3] == ans2[2] + c[2] * (c[1] - 1)) {
            c[4] = 1;
        } else {
            if (ans1[5] == ans1[4])
                c[4] = 2;
            else {
                c[4] = 0;
                while (c[4] * (c[4] - 1) / 2 != ans1[5] - ans1[4])
                    ++c[4];
                ++c[4];
            }
        }
    }
    for (int i = 5; i <= n; ++i) {
        if (i == n) {
            c[i] = ((ans2[n] - ans2[n - 1]) - c[i - 2] * c[i - 3]) / c[i - 2];
            c[i]++;
            break;
        }
        if (ans2[i] == ans2[i - 1] + c[i - 2] * c[i - 3]) {
            c[i] = 1;
        } else {
            if (ans1[i + 1] == ans1[i])
                c[i] = 2;
            else {
                c[i] = 0;
                while (c[i] * (c[i] - 1) / 2 != ans1[i + 1] - ans1[i])
                    ++c[i];
                ++c[i];
            }
        }
    }

    c[1]--;
    c[n]++;
    cout << "!";
    for (int i = 0; i < n; ++i) {
        cout << ' ' << c[i + 1] - 1;
    }
    cout << endl;

    return 0;
}


/*
    author:  Maksim1744
    created: 15.04.2020 19:12:54
*/

#include <bits/stdc++.h>

using namespace std;

#define ll   long long
#define ld   long double

#define mp   make_pair
#define pb   push_back
#define eb   emplace_back

#define sum(a)     ( accumulate ((a).begin(), (a).end(), 0ll))
#define mine(a)    (*min_element((a).begin(), (a).end()))
#define maxe(a)    (*max_element((a).begin(), (a).end()))
#define mini(a)    ( min_element((a).begin(), (a).end()) - (a).begin())
#define maxi(a)    ( max_element((a).begin(), (a).end()) - (a).begin())
#define lowb(a, x) ( lower_bound((a).begin(), (a).end(), (x)) - (a).begin())
#define uppb(a, x) ( upper_bound((a).begin(), (a).end(), (x)) - (a).begin())

template<typename T>             vector<T>& operator--            (vector<T>& v){for (auto& i : v) --i;            return  v;}
template<typename T>             vector<T>& operator++            (vector<T>& v){for (auto& i : v) ++i;            return  v;}
template<typename T>             istream& operator>>(istream& is,  vector<T>& v){for (auto& i : v) is >> i;        return is;}
template<typename T>             ostream& operator<<(ostream& os,  vector<T>& v){for (auto& i : v) os << i << ' '; return os;}
template<typename T, typename U> istream& operator>>(istream& is, pair<T, U>& p){is >> p.first >> p.second;        return is;}
template<typename T, typename U> ostream& operator<<(ostream& os, pair<T, U>& p){os << p.first << ' ' << p.second; return os;}
template<typename T, typename U> pair<T,U> operator-(pair<T,U> a, pair<T,U> b){return mp(a.first-b.first, a.second-b.second);}
template<typename T, typename U> pair<T,U> operator+(pair<T,U> a, pair<T,U> b){return mp(a.first+b.first, a.second+b.second);}
template<typename T, typename U> void umin(T& a, U b){if (a > b) a = b;}
template<typename T, typename U> void umax(T& a, U b){if (a < b) a = b;}

#ifdef HOME
#define TAG_LENGTH       25
#define LR_LEFT          left
#define LR_RIGHT         right
#define LR_VALUE         value
#define LR_SECOND_VALUE  mn
#include "C:/C++ libs/print.cpp"
#else
#define showl            42;
#define shows            42;
#define show(...)        42;
#define showm(...)       42;
#define showt(...)       42;
#define printTree(...)   42;
#define printGraph(...)  42;
#define printLRTree(...) 42;
#define printMatrix(...) 42;
#define printWGraph(...) 42;
#define debug     if (false)
#endif

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);

    int n;
    cin >> n;
    vector<int> v = {1, 2, 3, 1};
    for (int i = 0; i < n - 4; ++i) {
        v.pb(v.size());
    }
    vector<int> ans1(n + 1), ans2(n + 1);
    cin >> ans1[0] >> ans2[0];
    for (int i = 0; i < n; ++i) {
        cout << "+ " << v[i] << endl;
        cin >> ans1[i + 1] >> ans2[i + 1];
    }
    vector<int> c(n + 1, 0);
    if (ans2[2] != ans2[1]) {
        // c3 != 0
        if (ans1[2] == ans1[3]) {
            c[3] = 2;
        } else {
            while (c[3] * (c[3] - 1) / 2 != ans1[3] - ans1[2])
                ++c[3];
            ++c[3];
        }
    } else {
        c[3] = 1;
    }
    c[2] = (ans2[4] - ans2[3]) / c[3];
    c[1] = 1;
    while (c[1] * (c[1] - 1) / 2 != ans1[4] - ans1[3])
        ++c[1];
    ++c[1];

    if (n == 4) {
        c[4] = ((ans2[3] - ans2[2]) - (c[1] - 1) * c[2]) / c[2];
    } else {
        if (ans2[3] == ans2[2] + c[2] * (c[1] - 1)) {
            c[4] = 1;
        } else {
            if (ans1[5] == ans1[4])
                c[4] = 2;
            else {
                c[4] = 0;
                while (c[4] * (c[4] - 1) / 2 != ans1[5] - ans1[4])
                    ++c[4];
                ++c[4];
            }
        }
    }
    for (int i = 5; i <= n; ++i) {
        if (i == n) {
            c[i] = ((ans2[i] - ans2[i - 1]) - c[i - 2] * c[i - 3]) / c[i - 2];
            break;
        }
        if (ans2[i] == ans2[i - 1] + c[i - 2] * c[i - 3]) {
            c[i] = 1;
        } else {
            if (ans1[i + 1] == ans1[i])
                c[i] = 2;
            else {
                c[i] = 0;
                while (c[i] * (c[i] - 1) / 2 != ans1[i + 1] - ans1[i])
                    ++c[i];
                ++c[i];
            }
        }
    }

    c[1]--;
    c[n]++;
    cout << "!";
    for (int i = 0; i < n; ++i) {
        cout << ' ' << c[i + 1] - 1;
    }
    cout << endl;

    return 0;
}


/*
    author:  Maksim1744
    created: 15.04.2020 19:12:54
*/

#include <bits/stdc++.h>

using namespace std;

#define ll   long long
#define ld   long double

#define mp   make_pair
#define pb   push_back
#define eb   emplace_back

#define sum(a)     ( accumulate ((a).begin(), (a).end(), 0ll))
#define mine(a)    (*min_element((a).begin(), (a).end()))
#define maxe(a)    (*max_element((a).begin(), (a).end()))
#define mini(a)    ( min_element((a).begin(), (a).end()) - (a).begin())
#define maxi(a)    ( max_element((a).begin(), (a).end()) - (a).begin())
#define lowb(a, x) ( lower_bound((a).begin(), (a).end(), (x)) - (a).begin())
#define uppb(a, x) ( upper_bound((a).begin(), (a).end(), (x)) - (a).begin())

template<typename T>             vector<T>& operator--            (vector<T>& v){for (auto& i : v) --i;            return  v;}
template<typename T>             vector<T>& operator++            (vector<T>& v){for (auto& i : v) ++i;            return  v;}
template<typename T>             istream& operator>>(istream& is,  vector<T>& v){for (auto& i : v) is >> i;        return is;}
template<typename T>             ostream& operator<<(ostream& os,  vector<T>& v){for (auto& i : v) os << i << ' '; return os;}
template<typename T, typename U> istream& operator>>(istream& is, pair<T, U>& p){is >> p.first >> p.second;        return is;}
template<typename T, typename U> ostream& operator<<(ostream& os, pair<T, U>& p){os << p.first << ' ' << p.second; return os;}
template<typename T, typename U> pair<T,U> operator-(pair<T,U> a, pair<T,U> b){return mp(a.first-b.first, a.second-b.second);}
template<typename T, typename U> pair<T,U> operator+(pair<T,U> a, pair<T,U> b){return mp(a.first+b.first, a.second+b.second);}
template<typename T, typename U> void umin(T& a, U b){if (a > b) a = b;}
template<typename T, typename U> void umax(T& a, U b){if (a < b) a = b;}

#ifdef HOME
#define TAG_LENGTH       25
#define LR_LEFT          left
#define LR_RIGHT         right
#define LR_VALUE         value
#define LR_SECOND_VALUE  mn
#include "C:/C++ libs/print.cpp"
#else
#define showl            42;
#define shows            42;
#define show(...)        42;
#define showm(...)       42;
#define showt(...)       42;
#define printTree(...)   42;
#define printGraph(...)  42;
#define printLRTree(...) 42;
#define printMatrix(...) 42;
#define printWGraph(...) 42;
#define debug     if (false)
#endif

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);

    int n;
    cin >> n;
    vector<int> v = {1, 2, 3, 1};
    for (int i = 0; i < n - 4; ++i) {
        v.pb(v.size());
    }
    vector<int> ans1(n + 1), ans2(n + 1);
    cin >> ans1[0] >> ans2[0];
    for (int i = 0; i < n; ++i) {
        cout << "+ " << v[i] << endl;
        cin >> ans1[i + 1] >> ans2[i + 1];
    }
    vector<int> c(n + 1, 0);
    if (ans2[2] != ans2[1]) {
        // c3 != 0
        if (ans1[2] == ans1[3]) {
            c[3] = 2;
        } else {
            while (c[3] * (c[3] - 1) / 2 != ans1[3] - ans1[2])
                ++c[3];
            ++c[3];
        }
    } else {
        c[3] = 1;
    }
    c[2] = (ans2[4] - ans2[3]) / c[3];
    c[1] = 0;
    while (c[1] * (c[1] - 1) / 2 != ans1[4] - ans1[3])
        ++c[1];
    ++c[1];

    if (n == 4) {
        c[4] = ((ans2[3] - ans2[2]) - (c[1] - 1) * c[2]) / c[2];
        c[4]++;
    } else {
        if (ans2[3] == ans2[2] + c[2] * (c[1] - 1)) {
            c[4] = 1;
        } else {
            if (ans1[5] == ans1[4])
                c[4] = 2;
            else {
                c[4] = 0;
                while (c[4] * (c[4] - 1) / 2 != ans1[5] - ans1[4])
                    ++c[4];
                ++c[4];
            }
        }
    }
    for (int i = 5; i <= n; ++i) {
        if (i == n) {
            c[i] = ((ans2[n] - ans2[n - 1]) - c[i - 2] * c[i - 3]) / c[i - 2];
            break;
        }
        if (ans2[i] == ans2[i - 1] + c[i - 2] * c[i - 3]) {
            c[i] = 1;
        } else {
            if (ans1[i + 1] == ans1[i])
                c[i] = 2;
            else {
                c[i] = 0;
                while (c[i] * (c[i] - 1) / 2 != ans1[i + 1] - ans1[i])
                    ++c[i];
                ++c[i];
            }
        }
    }

    c[1]--;
    c[n]++;
    cout << "!";
    for (int i = 0; i < n; ++i) {
        cout << ' ' << c[i + 1] - 1;
    }
    cout << endl;

    return 0;
}


#include <bits/stdc++.h>

#define itn int
#define all(x) (x).begin(), (x).end()
#define make_unique(x) sort(all((x))); (x).resize(unique(all((x))) - (x).begin())

#define random_shuffle(...) shuffle(__VA_ARGS__, rng)
#define rand() rng()

#ifdef OLBOEB
	#define return std::cerr << __FUNCTION__ << "\n"; return
#endif  // OLBOEB

using namespace std;

inline int nxt() {
	int x;
	// scanf("%d", &x);
	cin >> x;
	return x;
}

// #define TEST

#ifdef TEST
const vector<int> guessed = {2, 0, 2, 0};
const int g_n = guessed.size();
vector<int> g_cur = guessed;
#endif

struct Info {
	int choose;
	int conseq;
};

Info operator -(const Info& fst, const Info& snd) {
	return {fst.choose - snd.choose, fst.conseq - snd.conseq};
}

Info readInfo() {
	int x = nxt(), y = nxt();
	return {x, y};
}

Info initial;
Info last;
Info delta;
vector<Info> history;

void ask(int pos) {
#ifdef TEST
	g_cur[pos] += 1;
	int ch = 0, co = 0;
	for (int i = 0; i < g_n; ++i) {
		ch += g_cur[i] * (g_cur[i] - 1) * (g_cur[i] - 2) / 6;
	}
	for (int i = 0; i + 3 <= g_n; ++i) {
		co += g_cur[i] * g_cur[i + 1] * g_cur[i + 2];
	}
	Info fresh = {ch, co};
#else
	cout << "+ " << pos + 1 << endl;
	Info fresh = readInfo();
#endif
	history.push_back(delta = fresh - last);
	last = fresh;
}

map<int, int> by_choose;

int main() {
	mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

	for (int i = 1; i < 1000; ++i) {
		by_choose[i * (i - 1) / 2] = i;
	}

#ifdef TEST
	int n = g_n;
	{
		int ch = 0, co = 0;
		for (int i = 0; i < g_n; ++i) {
			ch += g_cur[i] * (g_cur[i] - 1) * (g_cur[i] - 2) / 6;
		}
		for (int i = 0; i + 3 <= g_n; ++i) {
			co += g_cur[i] * g_cur[i + 1] * g_cur[i + 2];
		}
		last = initial = {ch, co};
	}
#else
	int n = nxt();
	last = initial = readInfo();
#endif
	vector<int> ans(n, -1);
	vector<int> a(n, -1);

	ask(0);
	if (delta.choose) {
		ans[0] = by_choose[delta.choose];
		a[0] = ans[0] + 1;
	}
	bool is_zero_among_12 = (delta.conseq == 0);
	ask(1);
	if (initial.conseq == last.conseq) {
		ans[2] = a[2] = 0;
	}
	if (delta.choose) {
		ans[1] = by_choose[delta.choose];
		a[1] = ans[1] + 1;
	}

	bool is_2_pressed = false;
	if (a[0] == -1 && a[1] == -1) {
		if (!is_zero_among_12) {
			ans[1] = 1;
			a[1] = 2;
			ask(0);
			ans[0] = by_choose[delta.choose] - 1;
			a[0] = ans[0] + 2;
		} else if (a[2] != 0) {
			ans[1] = 0;
			a[1] = 1;
			ask(0);
			ans[0] = by_choose[delta.choose] - 1;
			a[0] = ans[0] + 2;
		} else {
			ask(2);
			a[2] = 1;
			int conseq_after_2 = delta.conseq;
			ask(0);
			ans[0] = by_choose[delta.choose] - 1;
			a[0] = ans[0] + 2;
			a[1] = delta.conseq;
			ans[1] = a[1] - 1;
			if (conseq_after_2 == (a[0] - 1) * a[1]) {
				ans[3] = a[3] = 0;
			}
			is_2_pressed = true;
		}
	} else if (a[0] == -1) {
		ask(0);
		ans[0] = by_choose[delta.choose] - 1;
		a[0] = ans[0] + 2;
	} else if (a[1] == -1) {
		ask(1);
		ans[1] = by_choose[delta.choose] - 1;
		a[1] = ans[1] + 2;
	}

	for (int i = (is_2_pressed ? 3 : 2); i < n - 1; ++i) {
		if (a[i] == 0) {
			ask(i);
			++a[i];
		} else {
			ask(i);
			ans[i] = by_choose[delta.choose];
			a[i] = ans[i] + 1;
		}
		if (delta.conseq == a[i - 2] * a[i - 1]) {
			ans[i + 1] = a[i + 1] = 0;
		}
	}

	if (is_2_pressed && n == 4) {
		a[3] = ans[3] = (history[2].conseq - (ans[0] + 1) * (ans[1] + 1)) / (ans[1] + 1);
	} else {
		ans[n - 1] = a[n - 1] = (delta.conseq - a[n - 3] * a[n - 4]) / a[n - 3];
	}
#ifdef TEST
	if (ans != guessed) {
		cerr << "fail\n   your answer:";
		for (int x : ans) {
			cerr << " " << x;
		}
		cerr << "\ncorrect answer:";
		for (int x : guessed) {
			cerr << " " << x;
		}
		cerr << "\n";
	} else {
		cerr << "ok";
		for (int x : guessed) {
			cerr << " " << x;
		}
		cerr << "\n";
	}
#else
	cout << "!";
	for (int x : ans) {
		cout << " " << x;
	}
	cout << endl;
#endif

	return 0;
}