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 <bits/stdc++.h>
using namespace std;

uint MAX_VOL = 1e6;

void unpack(uint64_t state, uint vals[]) {
	for (int i = 2; i >= 0; i--) {
		vals[i] = state % MAX_VOL;
		state /= MAX_VOL;
	}
}

uint64_t to_state(const uint vals[]) {
	uint64_t result = 0;
	for (int i = 0; i < 3; i++)
		result = result * MAX_VOL + vals[i];
	return result;
}
	
int main() {
	ios_base::sync_with_stdio(0); cin.tie(0);
	
	uint A, B, C;
	uint a, b, c;
	
	unordered_set<uint64_t> visited;
	queue<pair<int, uint64_t>> cand;
	
	cin >> A >> B >> C;
	cin >> a >> b >> c;
	
	vector<int> min_obt(C+1, -1);
	
	const uint limits[3] = {A, B, C};
	uint tab_vals[3] = {a, b, c};
	
	auto zero_state = to_state(tab_vals);
	cand.push({0, zero_state});
	
	while (!cand.empty()) {
		auto top = cand.front(); cand.pop();
		if (visited.count(top.second)) continue;
		
		visited.insert(top.second);
		
		int dist = top.first;
		unpack(top.second, tab_vals);
		
		for (int i = 0; i < 3; i++)
			if (min_obt[tab_vals[i]] == -1)
				min_obt[tab_vals[i]] = dist;
		
		for (int i = 0; i < 3; i++)
			for (int j = 0; j < 3; j++) {
				if (i == j) continue;
				
				uint a = tab_vals[i];
				uint b = tab_vals[j];
				
				uint liq_sum = a + b;
				uint new_a, new_b;
				if (liq_sum <= limits[i]) {
					new_a = liq_sum;
					new_b = 0;
				} else {
					new_a = limits[i];
					new_b = liq_sum - limits[i];
				}
				
				tab_vals[i] = new_a;
				tab_vals[j] = new_b;
				
				auto new_state = to_state(tab_vals);
				if (!visited.count(new_state)) cand.push({dist + 1, new_state}); 
				
				tab_vals[i] = a;
				tab_vals[j] = b;
			}
	}
	
	for (int i : min_obt) cout << i << " ";
	cout << endl;
	
	return 0;
}