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
#include <iostream>
#include <vector>
#include <queue>
#include <cassert>
#define pii pair<int, int>
using namespace std;

int n, m, dist[2005];
bool iguess;
vector<pii> g[2005];

void send_number(int num, int bits){
    assert(num >= 0);
    for (int i = 0; i < bits; i++){
        cout << "+ " << num % 2 << endl;
        num /= 2;
    }
}

int read_number(int bits){
    int num = 0, mn = 1;
    for (int i = 0; i < bits; i++){
        cout << '?' << endl;
        bool bit;
        cin >> bit;
        num += bit * mn;
        mn *= 2;
    }
    return num;
}

int main(){
    string whoami;
    cin >> whoami;
    iguess = (whoami[0] == 'A');
    cin >> n >> m;
    for (int i = 0; i < m; i++){
        int u, v, c;
        cin >> u >> v >> c;
        g[u].push_back({c, v});
        g[v].push_back({c, u});
    }
    for (int i = 2; i <= n; i++)
        dist[i] = -1;
    dist[1] = 0;
    priority_queue<pii, vector<pii>, greater<pii>> q;
    for (auto el: g[1])
        q.push(el);
    int last_dist = 0;
    for (int i = 0; i < n - 1; i++){
        while (!q.empty() && dist[q.top().second] != -1)
            q.pop();
        int my_dist = (q.empty()?511:q.top().first - last_dist);
        send_number(my_dist, 9);
        int his_dist = read_number(9), node, dis;
        if (my_dist < his_dist || (my_dist == his_dist && iguess)){
            node = q.top().second;
            dis = my_dist;
            q.pop();
            send_number(node, 11);
        }
        else {
            node = read_number(11);
            dis = his_dist;
        }
        dis += last_dist;
        dist[node] = dis;
        last_dist = dis;
        for (auto el: g[node])
            q.push({el.first + dis, el.second});
    }
    if (!iguess)
        return 0;
    cout << "! ";
    for (int i = 1; i <= n; i++){
        cout << dist[i] << ' ';
    }
    cout << endl;
}