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
// Daniel Grzegorzewski
// while (clock()<=69*CLOCKS_PER_SEC)
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
// #pragma GCC optimize("Ofast")
// #pragma GCC target("avx,avx2,fma")

#define MP make_pair
#define PB push_back
#define ST first
#define ND second

using namespace __gnu_pbds;
using namespace std;

template <typename T>
using ordered_set =
    tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

//X.find_by_order(k); - zwraca iterator na k-ty element (numeracja od zerowego)
//X.order_of_key(k); - zwraca liczbę elementów ostro mniejszych niż k

typedef pair<int, int> PII;
typedef vector<int> VI;
typedef vector<PII> VII;
typedef long long LL;

void init_ios() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
}

auto random_address = [] { char *p = new char; delete p; return uint64_t(p); };
 
const uint64_t SEED = chrono::steady_clock::now().time_since_epoch().count() * (random_address() | 1);
mt19937_64 rng(SEED);

const int N = (int)1e5 + 3;

int cap[3], cur[3], res[N];
set<pair<PII, int>> vis;

void mini(int& x, int y) {
  if (x == -1)
    x = y;
  else
    x = min(x, y);
}

void calc() {
  queue<pair<PII, PII>> q;
  q.push({{0, cur[0]}, {cur[1], cur[2]}});
  while (!q.empty()) {
    auto el = q.front();
    q.pop();
    int dep = el.ST.ST;
    cur[0] = el.ST.ND, cur[1] = el.ND.ST, cur[2] = el.ND.ND;
    if (vis.find({{cur[0], cur[1]}, cur[2]}) != vis.end())
      continue;
    mini(res[cur[0]], dep);
    mini(res[cur[1]], dep);
    mini(res[cur[2]], dep);
    if (vis.find({{cur[0], cur[1]}, cur[2]}) != vis.end())
      return;
    vis.insert({{cur[0], cur[1]}, cur[2]});
    for (int i = 0; i < 3; ++i) {
      if (cur[i] == 0)
        continue;
      for (int j = 0; j < 3; ++j)
        if (i != j) {
          int tmp = min(cur[i], cap[j]-cur[j]);
          cur[i] -= tmp;
          cur[j] += tmp;
          q.push({{dep+1, cur[0]}, {cur[1], cur[2]}});
          cur[i] += tmp;
          cur[j] -= tmp;
        }
    }
  }
}

int main() {
  init_ios();
  cin >> cap[0] >> cap[1] >> cap[2];
  cin >> cur[0] >> cur[1] >> cur[2];
  for (int i = 0; i <= cap[2]; ++i)
    res[i] = -1;
  calc();
  for (int i = 0; i <= cap[2]; ++i)
    cout<<res[i]<<" ";
  cout<<"\n";
}