#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 9;
struct node {
  int id;
  long long t;
  bool operator<(const node &A) const { return id > A.id; }
} e[maxn];
bool cmp(node a, node b) { return a.t < b.t || a.t == b.t && a.id < b.id; }
long long ans[maxn];
int tr[maxn];
void update(int p, int v) {
  while (p < maxn) tr[p] += v, p += p & -p;
}
int query(int p) {
  int res = 0;
  while (p > 0) {
    res += tr[p];
    p -= p & -p;
  }
  return res;
}
int main() {
  int n;
  long long p;
  scanf("%d%lld", &n, &p);
  for (int i = 1; i <= n; i++) e[i].id = i, scanf("%lld", &e[i].t);
  sort(e + 1, e + 1 + n, cmp);
  priority_queue<node> W;
  queue<node> Q;
  int ar = 1;
  long long t = 0;
  while (ar <= n || !Q.empty() || !W.empty()) {
    if (Q.empty() && W.empty()) {
      t = e[ar].t;
      update(e[ar].id, 1);
      Q.push(e[ar++]);
    }
    if (Q.empty() && !W.empty()) {
      update(W.top().id, 1);
      Q.push(W.top());
      W.pop();
    }
    if (!Q.empty()) {
      node tmp = Q.front();
      Q.pop();
      t += p;
      ans[tmp.id] = t;
      while (ar <= n && e[ar].t <= t) {
        if (query(e[ar].id - 1) == 0)
          update(e[ar].id, 1), Q.push(e[ar++]);
        else
          W.push(e[ar++]);
      }
      update(tmp.id, -1);
      while (!W.empty() && query(W.top().id - 1) == 0) {
        tmp = W.top();
        W.pop();
        update(tmp.id, 1);
        Q.push(tmp);
      }
    }
  }
  for (int i = 1; i <= n; i++) {
    printf("%lld%c", ans[i], " \n"[i == n]);
  }
}
