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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include<algorithm>
#include<array>
#include<iomanip>
#include<ios>
#include<iostream>
#include<map>
#include<numeric>
#include<string>
#include<set>
#include<vector>
#include<queue>

// PROTOTYPY

// TYPY

struct Oczekuje {
	uint64_t kod;
	uint64_t t;
};

// DANE

static int suma;

// PROCEDURY

static uint64_t koduj(unsigned a, unsigned b, unsigned c) {
	(void)c;
	return (uint64_t(a) << 32) + b;
}

static void odkoduj(uint64_t kod, unsigned &a, unsigned &b, unsigned &c) {
	a = kod >> 32;
	b = kod - (uint64_t(a) << 32);
	c = suma - a - b;
}

static void przelej(unsigned &z, unsigned &w, const unsigned W) {
	if (z + w <= W) {
		w += z;
		z = 0;
	} else {
		z = (z + w) - W;
		w = W;
	}
}

int main()
{
	unsigned a, b, c, A, B, C;
	std::map<unsigned, uint64_t> kiedy;
	std::set<uint64_t> stany;
	std::queue<Oczekuje> kolejka;
	std::set<unsigned> pozadane;

	std::cin >> A >> B >> C;
	std::cin >> a >> b >> c;

	for (unsigned i = 0; i <= C; ++i) {
		pozadane.insert(i);
	}

	suma = a + b + c;
	kolejka.push({koduj(a, b, c), 1});
	stany.insert(koduj(a, b, c));
	kiedy.insert({a, 0});
	kiedy.insert({b, 0});
	kiedy.insert({c, 0});
	pozadane.erase(a);
	pozadane.erase(b);
	pozadane.erase(c);

	while (!kolejka.empty() && !pozadane.empty()) {
		Oczekuje ocz = kolejka.front();
		uint64_t kod = ocz.kod;
		uint64_t t = ocz.t;
        kolejka.pop();
//		std::cerr << std::hex << std::setw(12) << kod << ' ' << std::dec << kiedy.size() << std::endl;

		auto dzialaj = [&a, &b, &c, &t, &kod, &kolejka, &stany, &kiedy, &pozadane](unsigned &z, unsigned &w, unsigned W) {
            odkoduj(kod, a, b, c);
//			std::cerr << std::hex << std::setw(12) << kod << ' ' << std::dec << a << ' ' << b << ' ' << c << ' ' << z << ' ' << w << std::endl;
            przelej(z, w, W);
			kiedy.insert({z, t});
			kiedy.insert({w, t});
			pozadane.erase(z);
			pozadane.erase(w);
            uint64_t nowy_kod = koduj(a, b, c);
//			std::cerr << std::hex << std::setw(12) << nowy_kod << ' ' << std::dec << a << ' ' << b << ' ' << c << std::endl;
            if (stany.find(nowy_kod) == stany.end()) {
                stany.insert(nowy_kod);
				kolejka.push({nowy_kod, t+1});
            }
		};
		dzialaj(a, b, B);
		dzialaj(a, c, C);
		dzialaj(b, a, A);
		dzialaj(b, c, C);
		dzialaj(c, a, A);
		dzialaj(c, b, B);
//		std::cerr << std::endl;
	}

	for (unsigned i = 0; i < C+1; ++i) {
		if (kiedy.find(i) != kiedy.end()) {
			std::cout << kiedy[i] << ' ';
		} else {
			std::cout << -1 << ' ';
		}
	}

	std::cout << std::endl;

	return 0;
}