#include <bits/stdc++.h>
using namespace std;
template <class C>
void mini(C& a, C b) {
  a = min(a, b);
}
template <class C>
void maxi(C& a, C b) {
  a = max(a, b);
}
int n, m;
bool dfs(vector<vector<int> >& grafo, vector<int>& color, int nodo) {
  if (color[nodo] == 2) return false;
  if (color[nodo] == 1) return true;
  color[nodo] = 1;
  for (int i = 0; i < grafo[nodo].size(); i++) {
    int otro = grafo[nodo][i];
    if (dfs(grafo, color, otro)) return true;
  }
  color[nodo] = 2;
  return false;
}
bool hayCiclo(vector<vector<int> >& grafo) {
  vector<int> color(n + 1);
  for (int(i) = 1; i <= n; i++)
    if (dfs(grafo, color, i)) return true;
  return false;
}
void dfs2(vector<vector<int> >& grafo, vector<bool>& visitado, int nodo) {
  if (visitado[nodo]) return;
  visitado[nodo] = true;
  for (int i = 0; i < grafo[nodo].size(); i++) {
    int otro = grafo[nodo][i];
    dfs2(grafo, visitado, otro);
  }
}
void c() {
  cin >> n >> m;
  vector<vector<int> > grafo(n + 1), grafor(n + 1);
  int u, v;
  for (int i = 0; i < m; i++) {
    cin >> u >> v;
    grafo[u].push_back(v);
    grafor[v].push_back(u);
  }
  if (hayCiclo(grafo)) {
    cout << "-1\n";
    return;
  }
  vector<char> res(n + 1);
  int cant = 0;
  vector<bool> visitado1(n + 1, false);
  vector<bool> visitado2(n + 1, false);
  for (int(i) = 1; i <= n; i++) {
    if (visitado1[i] or visitado2[i])
      res[i] = 'E';
    else
      res[i] = 'A';
    dfs2(grafo, visitado1, i);
    dfs2(grafor, visitado2, i);
  }
  for (int(i) = 1; i <= n; i++)
    if (res[i] == 'A') cant++;
  cout << cant << '\n';
  for (int(i) = 1; i <= n; i++) cout << res[i];
  cout << '\n';
}
long long cuantos(long long a, long long delta) {
  if (a - 1 < delta) return 0;
  long long lo = 0;
  long long hi = a;
  while (lo + 1 != hi) {
    long long mid = (lo + hi) / 2;
    if (a - 3 * mid * mid - 3 * mid - 1 >= delta)
      lo = mid;
    else
      hi = mid;
  }
  return hi;
}
bool llegoAK(vector<long long>& a, long long k, long long mid) {
  for (int i = 0; i < n; i++) k -= cuantos(a[i], mid);
  return k <= 0;
}
void d() {
  long long k;
  cin >> n >> k;
  vector<long long> a(n);
  for (int i = 0; i < n; i++) cin >> a[i];
  long long lo = -3e18;
  long long hi = 3e18;
  while (lo + 1 != hi) {
    long long mid = (lo + hi) / 2;
    if (llegoAK(a, k, mid))
      lo = mid;
    else
      hi = mid;
  }
  long long delta = lo;
  vector<long long> b(n);
  vector<int> masChiquitos;
  long long minDelta = 3e18;
  for (int i = 0; i < n; i++) {
    b[i] = cuantos(a[i], delta);
    k -= b[i];
    if (a[i] - 3 * b[i] * b[i] - 3 * b[i] - 1 < minDelta) {
      minDelta = a[i] - 3 * b[i] * b[i] - 3 * b[i] - 1;
      masChiquitos.clear();
      masChiquitos.push_back(i);
    } else if (a[i] - 3 * b[i] * b[i] - 3 * b[i] - 1 == minDelta)
      masChiquitos.push_back(i);
  }
  while (k < 0) {
    k++;
    b[masChiquitos.back()]--;
    masChiquitos.pop_back();
  }
  for (int i = 0; i < n; i++) cout << b[i] << ' ';
  cout << '\n';
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  d();
  return 0;
}
