#include <iostream>
using namespace std;
struct Pituus {
int arvo;
bool olemassa = true;
Pituus* vasen = nullptr;
Pituus* oikea = nullptr;
Pituus(int luku) {
arvo = luku;
}
~Pituus() {
if (vasen != nullptr) {
delete vasen;
}
if (oikea != nullptr) {
delete oikea;
}
}
void Add(int luku) {
if (luku < arvo) {
if (vasen == nullptr) {
vasen = new Pituus(luku);
} else {
vasen->Add(luku);
}
} else {
if (oikea == nullptr) {
oikea = new Pituus(luku);
} else {
oikea->Add(luku);
}
}
}
Pituus* Get(int luku) {
if (luku == arvo) {
return this;
} else if (luku < arvo) {
if (vasen == nullptr) {
return this;
} else {
return vasen->Get(luku);
}
} else {
if (oikea == nullptr) {
return this;
} else {
return oikea->Get(luku);
}
}
}
int Suurin(int varaArvo=0) {
if (oikea == nullptr) {
if (olemassa) {
return arvo;
} else if (vasen != nullptr) {
return vasen->Suurin(varaArvo);
} else {
return varaArvo;
}
} else {
return oikea->Suurin(olemassa ? arvo : varaArvo);
}
}
int ToiseksiSuurin(int varaArvo = 0) {
int suurin = Suurin();
if (oikea == nullptr) {
return (*vasen).arvo;
} else if ((*oikea).arvo == suurin) {
if (olemassa) {
return arvo;
} else if (vasen != nullptr) {
return vasen->ToiseksiSuurin(varaArvo);
} else {
return varaArvo;
}
} else {
return oikea->ToiseksiSuurin(olemassa ? arvo : varaArvo);
}
}
int Pienin(int varaArvo=0) {
if (vasen == nullptr) {
return olemassa ? arvo : varaArvo;
} else {
return vasen->Pienin(olemassa ? arvo : varaArvo);
}
}
void mPrint() {
if (vasen != nullptr) {
vasen->mPrint();
}
if (olemassa) {
cout << '|' << arvo << '|';
}
if (oikea != nullptr) {
oikea->mPrint();
}
}
void Leikkaa(int luku, int nimittaja) {
(*this->Get(luku)).olemassa = false;
int pikkuosia = nimittaja * ((luku / nimittaja) + 1) - luku;
for (int i = 0; i < pikkuosia; i++) {
Add(luku / nimittaja);
}
for (int i = 0; i < nimittaja - pikkuosia; i++) {
Add(luku / nimittaja + 1);
}
}
};
int main() {
int n, m;
cin >> n >> m;
int tikku1;
cin >> tikku1;
int* alkutikut = new int[n] {tikku1};
for (int i = 1; i < n; i++) {
int tikku;
cin >> tikku;
alkutikut[i] = tikku;
}
for (int k = 1; k <= m; k++) {
Pituus* tikut = new Pituus(tikku1);
for (int i = 1; i < n; i++) {
tikut->Add(alkutikut[i]);
}
for (int l = 0; l < k; l++) {
int suurin = tikut->Suurin();
int toiseksiSuurin = tikut->ToiseksiSuurin();
int leikkaus = 2;
while (ceil((float)suurin / (float)leikkaus) > toiseksiSuurin && leikkaus - 1 < k - l) {
leikkaus += 1;
l++;
}
tikut->Leikkaa(suurin, leikkaus); // Tee pituudesta jotenkin sellainen, ettei se jaa ainoastaan kahdella. Sä pystyt siihen ehkä :ɔ
}
// tikut->mPrint();
cout << tikut->Suurin() - tikut->Pienin();
if (k < m) {
cout << " ";
}
}
return 0;
}