#include <bits/stdc++.h>
using namespace std;
struct STree {
  vector<int> sum;
  int xl, xr, val;
  int sz;
  void build(int n) {
    sz = 1;
    while (sz < n) sz *= 2;
    sum.resize(2 * sz);
  }
  int getSum(int v, int l, int r) {
    if (xl <= l && r <= xr) return sum[v];
    if (r < xl || xr < l) return 0;
    int m = (l + r) / 2;
    return getSum(v * 2, l, m) + getSum(v * 2 + 1, m + 1, r);
  }
  void setX(int v, int l, int r) {
    if (l == r) {
      sum[v] = val;
    } else {
      int m = (l + r) / 2;
      if (xl <= m)
        setX(v * 2, l, m);
      else
        setX(v * 2 + 1, m + 1, r);
      sum[v] = sum[v * 2] + sum[v * 2 + 1];
    }
  }
  int getSum(int from, int to) {
    xl = from;
    xr = to;
    return getSum(1, 1, sz);
  }
  void setX(int pos, int value) {
    xl = pos;
    val = value;
    setX(1, 1, sz);
  }
};
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int64_t n, px;
  cin >> n >> px;
  vector<int64_t> t(n);
  for (int i = 0; i < n; ++i) {
    cin >> t[i];
  }
  STree s;
  s.build(n);
  for (int i = 0; i < n; ++i) {
    s.setX(i + 1, 1);
  }
  set<int> ready;
  vector<int64_t> ans(n);
  set<pair<int64_t, pair<bool, int>>> g;
  for (int i = 0; i < n; ++i) {
    g.insert({t[i], {0, i + 1}});
  }
  int64_t last = 0;
  while (!g.empty()) {
    auto p = *g.begin();
    g.erase(g.begin());
    if (p.second.first) {
      ans[p.second.second - 1] = p.first;
      s.setX(p.second.second, 1);
    } else {
      ready.insert(p.second.second);
    }
    if (!ready.empty()) {
      int k = *ready.begin();
      if (k == 1 || s.getSum(1, k - 1) == k - 1) {
        s.setX(k, 0);
        last = max(last, p.first) + px;
        g.insert({last, {1, k}});
        ready.erase(ready.begin());
      }
    }
  }
  for (int i = 0; i < n; ++i) {
    cout << ans[i] << ' ';
  }
  cout << endl;
  return 0;
}
