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 <iostream>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> podziel_skarb(int n, int m, const vector<int>& a) {
    vector<int> b(n, -1);  // Wynikowy podział, początkowo wszyscy wyrzuceni za burtę
    vector<bool> aktywni(n, true);  // Czy pirat jest jeszcze aktywny (nie wyrzucony)

    // Symulacja procesu podziału
    while (true) {
        // Znajdź pirata o najwyższej hierarchii, który jest jeszcze aktywny
        int proponujacy = -1;
        for (int i = 0; i < n; ++i) {
            if (aktywni[i]) {
                proponujacy = i;
                break;
            }
        }

        // Jeśli nie ma już aktywnych piratów, kończymy
        if (proponujacy == -1) break;

        // Propozycja podziału: pirat proponujący bierze wszystko
        vector<int> propozycja(n, 0);
        propozycja[proponujacy] = m;

        // Liczenie głosów za i przeciw
        int glosy_za = 0;
        for (int i = 0; i < n; ++i) {
            if (!aktywni[i]) continue;  // Wyrzuceni nie głosują

            // Pirat głosuje za, jeśli dostaje co najmniej tyle, ile by dostał po odrzuceniu podziału, plus jego chciwość
            if (propozycja[i] >= b[i] + a[i]) {
                glosy_za++;
            }
        }

        // Jeśli podział jest zaakceptowany, zapisujemy wynik i kończymy
        int aktywni_piraci = count(aktywni.begin(), aktywni.end(), true);
        if (glosy_za >= (aktywni_piraci / 2 + 1)) {
            b = propozycja;
            break;
        } else {
            // W przeciwnym przypadku wyrzucamy proponującego za burtę
            aktywni[proponujacy] = false;
        }
    }

    return b;
}

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

    int n, m;
    cin >> n >> m;

    vector<int> a(n);
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
    }

    vector<int> wynik = podziel_skarb(n, m, a);

    for (int i = 0; i < n; ++i) {
        cout << wynik[i] << " ";
    }
    cout << endl;

    return 0;
}