1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef vector<int> VI;
typedef long long ll;
typedef pair<int,int> PII;
typedef double db;
//mt19937 mrand(random_device{}());
const ll mod=1000000007;
//int rnd(int x) { return mrand() % x;}
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
int gcd(int a,int b) { return b?gcd(b,a%b):a;}
// head

const int MAX_STR=25,N=2e3+5;

#define INF 0x3f3f3f3f

template<class T> inline void read(T &x) {
    x=0; int c=getchar(),f=1;
    for (;!isdigit(c);c=getchar()) if (c==45) f=-1;
    for (;isdigit(c);c=getchar()) (x*=10)+=f*(c-'0');
}

void send_bit(int bit) {
    printf("+ %d\n", bit);
    fflush(stdout);
}

int read_bit() {
    printf("?\n");
    fflush(stdout);
    char c;
    scanf(" %c",&c);
    return c-'0';
}

void send_int(int val,int bits) {
    per(i,0,bits) send_bit((val>>i)&1);
}

int read_int(int bits) {
    int val=0;
    per(i,0,bits) val=(val<<1)|read_bit();
    return val;
}

char person[MAX_STR];
vector<PII> e[N];
int dist_local[N],dist_global[N];

int main() {
    if (scanf("%s",person)==EOF) return 0;
    bool is_algosia=(strcmp(person,"Algosia")==0);
    int n,m;
    scanf("%d%d",&n,&m);
    rep(i,0,m) {
        int u,v,w;
        scanf("%d%d%d",&u,&v,&w);
        u--;
        v--;
        e[u].pb({v,w});
        e[v].pb({u,w});
    }
    VI unvisited;
    rep(i,1,n) unvisited.pb(i);
    rep(i,0,n) dist_local[i]=INF,dist_global[i]=INF;
    dist_global[0]=0;
    for (const auto &[v,w]:e[0]) dist_local[v]=min(dist_local[v],w);
    int curr_dist=0;
    rep(step,1,n) {
        int min_local=INF,min_local_idx=-1,k=SZ(unvisited);
        rep(i,0,k) {
            int v=unvisited[i];
            if (dist_local[v]<min_local) {
                min_local=dist_local[v];
                min_local_idx=i;
            }
        }
        int k_bits=0;
        if (k>1) while ((1<<k_bits)<k) k_bits++;
        int delta_local=min(511,max(0,min_local-curr_dist)),delta_global,min_global_idx;
        if (is_algosia) {
            send_int(delta_local,9);
            int bajtek_wins=read_bit();
            if (bajtek_wins) {
                delta_global=read_int(9);
                min_global_idx=read_int(k_bits);
            } else {
                delta_global=delta_local;
                min_global_idx=min_local_idx;
                send_int(min_global_idx,k_bits);
            }
        } else {
            int delta_algosia=read_int(9);
            if (delta_local<delta_algosia) {
                send_bit(1);
                send_int(delta_local,9);
                delta_global=delta_local;
                min_global_idx=min_local_idx;
                send_int(min_global_idx,k_bits);
            } else {
                send_bit(0);
                delta_global=delta_algosia;
                min_global_idx=read_int(k_bits);
            }
        }
        curr_dist+=delta_global;
        int u=unvisited[min_global_idx];
        dist_global[u]=curr_dist;
        swap(unvisited[min_global_idx],unvisited.back());
        unvisited.pop_back();
        for (const auto &[v,w]:e[u]) dist_local[v]=min(dist_local[v],curr_dist+w);
    }
    if (is_algosia) {
        printf("!");
        rep(i,0,n) printf(" %d",dist_global[i]);
        puts("");
        fflush(stdout);
    }
}