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
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>

using namespace std;

struct But
{
    int a, b, c;

    But(int a, int b, int c) : a(a), b(b), c(c)
    {
    }

    bool operator<(const But &but) const
    {
        if (a!=but.a)
            return a<but.a;
        if (b!=but.b)
            return b<but.b;
        return c<but.c;
    }
};

int wyn[100001];
set<But> byly;
vector<But> nast;

void dodaj(const But &but, int krok)
{
    if (wyn[but.a]==-1)
        wyn[but.a]=krok;
    if (wyn[but.b]==-1)
        wyn[but.b]=krok;
    if (wyn[but.c]==-1)
        wyn[but.c]=krok;
    if (byly.insert(but).second)
        nast.push_back(but);
}

void lej(But &but, int p2, int &i1, int &i2, int krok)
{
    int ile=min(i1, p2-i2);
    i1-=ile;
    i2+=ile;
    dodaj(but, krok);
    i1+=ile;
    i2-=ile;
}

int main()
{
    ios_base::sync_with_stdio(false);

    int pa, pb, pc, a, b, c;
    cin>>pa>>pb>>pc>>a>>b>>c;
    for (int i=0; i<=pc; ++i)
        wyn[i]=-1;

    dodaj(But(a, b, c), 0);
    for (int krok=1; !nast.empty(); ++krok)
    {
        vector<But> biez;
        biez.swap(nast);
        for (int i=0; i<biez.size(); ++i)
        {
            But &but=biez[i];

            lej(but, pb, but.a, but.b, krok);
            lej(but, pc, but.a, but.c, krok);

            lej(but, pa, but.b, but.a, krok);
            lej(but, pc, but.b, but.c, krok);

            lej(but, pa, but.c, but.a, krok);
            lej(but, pb, but.c, but.b, krok);
        }
    }

    for (int i=0; i<=pc; ++i)
        cout<<wyn[i]<<' ';
    cout<<endl;
    return 0;
}