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
#include <cstdio>
#include <queue>
#include <set>
#include <algorithm>
#define MAKS 100010
#define mp make_pair
using namespace std;
typedef long long int lld;
int wyn[MAKS];
set<lld> S;
queue< pair<lld,int> > q;
lld koduj(int* w)
{
    return lld(w[0])*lld(MAKS)*lld(MAKS) + lld(w[1])*lld(MAKS) + lld(w[2]);
}
void dekoduj(lld v, int* w)
{
    w[2]=v%lld(MAKS);
    v/=lld(MAKS);
    w[1]=v%lld(MAKS);
    v/=lld(MAKS);
    w[0]=v;
}
int main()
{
    int poj[3];
    scanf("%d %d %d",&poj[0], &poj[1], &poj[2]);
    int w[3];
    scanf("%d %d %d",&w[0], &w[1], &w[2]);

    for(int i=0;i<=poj[2];i++)wyn[i]=-1;

    lld vstart=koduj(w);
    S.insert(vstart);
    q.push(mp(vstart,0));
    while(!q.empty())
    {
        pair<lld, int> p = q.front();
        q.pop();
        lld v=p.first; int odl=p.second;

        int b[3];
        dekoduj(v, b);

        for(int i=0;i<3;i++)
        {
            if(wyn[b[i]]==-1 || odl<wyn[b[i]])wyn[b[i]]=odl;
        }

        for(int i=0;i<3;i++)
        {
            for(int j=0;j<3;j++)
            {
                if(i==j)continue;
                int wody=min(b[i], poj[j]-b[j]);
                if(wody>0)
                {
                    int bb[3]={b[0], b[1], b[2]};
                    bb[i]-=wody; bb[j]+=wody;
                    lld u=koduj(bb);
                    if(S.find(u)==S.end())
                    {
                        q.push(mp(u, odl+1));
                        S.insert(u);
                    }
                }

            }
        }
    }

    for(int i=0;i<=poj[2];i++)printf("%d ",wyn[i]);
    puts("");
}