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
#include <cstdio>
#include <queue>
#include <set>
using namespace std;

int A,B,C;
const int maxN = 1e5+10;
int ans[maxN];

struct XD {
    int a, b, c, ansXD;

    XD(int a, int b, int c, int ansXD) : a(a), b(b), c(c), ansXD(ansXD) {}

    void set_ans() {
        if(!ans[a]) ans[a]=ansXD;
        if(!ans[b]) ans[b]=ansXD;
        if(!ans[c]) ans[c]=ansXD;
    }

    long long xDll() {
        return a + b * 1LL * maxN + c * 1LL * maxN * 1LL * maxN;
    }
};


set<long long> S;
queue<XD> k;
int ansXD;

void try_adding_XDDD(int a, int b, int c) {
    XD xD(a,b,c,ansXD);
    if(S.find(xD.xDll()) != S.end())
        return;
    S.insert(xD.xDll());
    k.emplace(a, b, c, ansXD);
}


void bfs(int sa, int sb, int sc) {
    k.emplace(sa, sb, sc, 1);
    S.insert(k.front().xDll());
    ans[sa] = ans[sb] = ans[sc];
    while(!k.empty()) {
        XD xD = k.front();
        xD.set_ans();
        ansXD = xD.ansXD+1;
        k.pop();
        int xd = min(B-xD.b, xD.a);
        try_adding_XDDD(xD.a-xd, xD.b+xd, xD.c);
        xd=min(xD.b, A-xD.a);
        try_adding_XDDD(xD.a+xd, xD.b-xd, xD.c);
        xd=min(xD.b, C-xD.c);
        try_adding_XDDD(xD.a, xD.b-xd, xD.c+xd);
        xd=min(B-xD.b, xD.c);
        try_adding_XDDD(xD.a, xD.b+xd, xD.c-xd);
        xd=min(A-xD.a, xD.c);
        try_adding_XDDD(xD.a+xd, xD.b, xD.c-xd);
        xd=min(xD.a, C-xD.c);
        try_adding_XDDD(xD.a-xd, xD.b, xD.c+xd);
    }
}


int main() {
    scanf("%d%d%d", &A, &B, &C);
    int a, b, c;
    scanf("%d%d%d", &a, &b, &c);
    bfs(a, b, c);
    for(int i=0; i<=C; ++i)
        printf("%d ", ans[i]-1);
    return 0;
}