#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
long long INF = 1e18;
long long a[N];
long long ans[N];
struct node {
  long long mn = 0, mx = 0;
};
node seg[4 * N];
int n;
node Merge(node a, node b) {
  node ret;
  ret.mn = min(a.mn, b.mn);
  ret.mx = min(a.mx, b.mx);
  ret.mn = max(ret.mn, ret.mx);
  return ret;
}
void push(int id, int l, int r) {
  seg[id].mn = max(seg[id].mn, seg[id].mx);
  if (l != r) {
    seg[id * 2].mx = max(seg[id * 2].mx, seg[id].mx);
    seg[id * 2 + 1].mx = max(seg[id * 2 + 1].mx, seg[id].mx);
  }
}
void update(int su, int eu, long long val, int id = 1, int l = 0,
            int r = n - 1) {
  push(id, l, r);
  if (l >= su && r <= eu) {
    seg[id].mx = max(seg[id].mx, val);
    push(id, l, r);
    return;
  }
  if (r < su || l > eu) return;
  int mid = (l + r) / 2;
  update(su, eu, val, id * 2, l, mid);
  update(su, eu, val, id * 2 + 1, mid + 1, r);
  seg[id] = Merge(seg[id * 2], seg[id * 2 + 1]);
}
int query(int id = 1, int l = 0, int r = n - 1) {
  push(id, l, r);
  if (l == r) return l;
  int mid = (l + r) / 2;
  push(id * 2, l, mid);
  push(id * 2 + 1, mid + 1, r);
  if (seg[id * 2].mn <= seg[id * 2 + 1].mn)
    return query(id * 2, l, mid);
  else
    return query(id * 2 + 1, mid + 1, r);
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int p;
  cin >> n >> p;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
    update(i, i, a[i]);
  }
  long long cur = 0;
  for (int i = 0; i < n; i++) {
    int idx = query();
    update(idx, idx, INF);
    cur = max(cur, a[idx]) + p;
    update(idx + 1, n - 1, cur);
    ans[idx] = cur;
  }
  for (int i = 0; i < n; i++) cout << ans[i] << " ";
  cout << endl;
  return 0;
}
