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
#ifdef _MSC_VER
  #ifndef __GNUC__
    #pragma warning(disable: 4996)
  #endif
  #define main main0
#endif
#include <algorithm>
#include <iostream>
#include <list>
#include <map>
using namespace std;
typedef long long           ll;
typedef unsigned long long ull;
typedef unsigned int      uint;

const ll milion = 1000000;
int wyniki[100005];
map<ll, int> mapaStanow;
list<ll> listaStanow;
int ruchow, rozwiazan;
bool AeqB, BeqC;

void ObliczStan(int *but) {
  int a = but[0], b = but[1], c = but[2];
  if(AeqB && (a > b)) swap(a, b);
  if(BeqC && (b > c)) swap(b, c);
  if(AeqB && (a > b)) swap(a, b);
  ll klucz = ((ll)a * milion + b) * milion + c;
  if(mapaStanow.insert(pair<ll,int>(klucz, ruchow)).second) {
    listaStanow.push_back(klucz);
    if(wyniki[a] < 0) { wyniki[a] = ruchow; ++rozwiazan; }
    if(wyniki[b] < 0) { wyniki[b] = ruchow; ++rozwiazan; }
    if(wyniki[c] < 0) { wyniki[c] = ruchow; ++rozwiazan; }
  }
}

int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);

  int butelka[3];
  int oranzada[3];
  int C_Plus1;
  ll klucz;

  mapaStanow.clear();
  listaStanow.clear();
  ruchow = 0; rozwiazan = 0;
  cin >> butelka[0] >> butelka[1] >> butelka[2];//A B C
  cin >> oranzada[0] >> oranzada[1] >> oranzada[2];//a b c
  C_Plus1 = butelka[2] + 1;
  if(butelka[0] == butelka[1]) AeqB = true; else AeqB = false;
  if(butelka[1] == butelka[2]) BeqC = true; else BeqC = false;
  fill_n(wyniki, C_Plus1, -1);
  if(AeqB && (oranzada[0] > oranzada[1])) swap(oranzada[0], oranzada[1]);
  if(BeqC && (oranzada[1] > oranzada[2])) swap(oranzada[1], oranzada[2]);
  if(AeqB && (oranzada[0] > oranzada[1])) swap(oranzada[0], oranzada[1]);
  klucz = ((ll)oranzada[0] * milion + oranzada[1]) * milion + oranzada[2];
  mapaStanow.insert(pair<ll,int>(klucz, ruchow));
  listaStanow.push_back(klucz);
  wyniki[oranzada[0]] = 0; rozwiazan = 1;
  if(wyniki[oranzada[1]] < 0) { wyniki[oranzada[1]] = 0; ++rozwiazan; }
  if(wyniki[oranzada[2]] < 0) { wyniki[oranzada[2]] = 0; ++rozwiazan; }
  while(!(listaStanow.empty() || (rozwiazan >= C_Plus1))) {
    klucz = listaStanow.front();
    listaStanow.pop_front();
    oranzada[2] = klucz % milion;
    oranzada[1] = klucz / milion % milion;
    oranzada[0] = klucz / milion / milion % 1000000;
    ruchow = mapaStanow.find(klucz)->second + 1;
    for(int iOd = 0; iOd < 3; ++iOd) {
      int iDo = (iOd + 1) % 3;
      int iInne = (iOd + 2) % 3;
      int but[3];
      if(oranzada[iOd] > 0) {
        for(int i = 0; i < 2; ++i) { 
          if(oranzada[iOd] + oranzada[iDo] <= butelka[iDo]) {
            but[iOd] = 0;
            but[iDo] = oranzada[iDo] + oranzada[iOd];
            but[iInne] = oranzada[iInne];
            ObliczStan(but);
          } else {
            but[iOd] = oranzada[iOd] - (butelka[iDo] - oranzada[iDo]);
            but[iDo] = butelka[iDo];
            but[iInne] = oranzada[iInne];
            ObliczStan(but);
          }
          swap(iDo, iInne);
        }
      }
    }
  }

  for(int i = 0; i < C_Plus1; ++i)
    cout << wyniki[i] << ' ';
  cout << endl;

  return 0;
}