#include <bits/stdc++.h>
using namespace std;
vector<int> zroner;
long long n, k, x, a[200002], m;
int nshan[200002];
pair<long long, long long> d[800002];
void tpel() {
  for (int i = 0; i < n; i++) cout << a[i] << " ";
  cout << endl;
}
pair<long long, long long> get_ans(long long v, long long tl, long long tr,
                                   long long l, long long r) {
  if (l == tl && r == tr) return d[v];
  long long tm = (tl + tr) / 2;
  if (tm < l) return get_ans(2 * v + 1, tm + 1, tr, l, r);
  if (tm >= r) return get_ans(2 * v, tl, tm, l, r);
  return min(get_ans(2 * v, tl, tm, l, tm),
             get_ans(2 * v + 1, tm + 1, tr, tm + 1, r));
}
void update(long long in, long long ar) {
  d[in].first += ar;
  in /= 2;
  while (in > 0) {
    d[in] = min(d[2 * in], d[2 * in + 1]);
    in /= 2;
  }
}
int main() {
  scanf("%d%d%d", &n, &k, &x);
  int md = 1000000000, mdi = -1, mb = -1000000000, mbi = -1;
  for (int i = 0; i < n; i++) {
    scanf("%lld", a + i);
    if (a[i] < 0) {
      m++;
      if (a[i] >= mb) {
        mb = a[i];
        mbi = i;
      }
    } else {
      if (a[i] <= md) {
        md = a[i];
        mdi = i;
      }
    }
    if (a[i] == 0) zroner.push_back(i);
  }
  int l = zroner.size() - 1;
  for (int i = 0; i < l; i++) {
    a[zroner[i]] += x;
    k--;
    if (k == 0) {
      tpel();
      return 0;
    }
  }
  if (l >= 0) {
    if (m % 2 == 0) {
      a[zroner[l]] -= x;
      k--;
      if (k == 0) {
        tpel();
        return 0;
      }
    } else {
      a[zroner[l]] += x;
      k--;
      if (k == 0) {
        tpel();
        return 0;
      }
    }
  }
  if (m % 2 == 0) {
    if (mdi == -1 || (md >= mb * -1 && mbi != -1)) {
      while (a[mbi] <= 0) {
        a[mbi] += x;
        k--;
        if (k == 0) {
          tpel();
          return 0;
        }
      }
    } else {
      while (a[mdi] >= 0) {
        a[mdi] -= x;
        k--;
        if (k == 0) {
          tpel();
          return 0;
        }
      }
    }
  }
  for (int i = 0; i < n; i++) nshan[i] = (a[i] < 0 ? -1 : 1);
  int ast = 1;
  while (ast < n) ast *= 2;
  for (int i = 0; i < n; i++) d[ast + i] = make_pair(max(a[i], -1 * a[i]), i);
  for (int i = n; i < ast; i++) d[ast + i] = make_pair(1000000000000000000, -1);
  for (int i = ast - 1; i > 0; i--) d[i] = min(d[2 * i], d[2 * i + 1]);
  while (k > 0) {
    pair<long long, long long> p = get_ans(1, 0, ast - 1, 0, n - 1);
    if (nshan[p.second] == 1) {
      a[p.second] += x;
      k--;
      update(p.second + ast, x);
    } else {
      a[p.second] -= x;
      k--;
      update(p.second + ast, x);
    }
  }
  tpel();
  return 0;
}
