#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5;
struct node {
  int t, id;
  node(int _t = 0, int _id = 0) : t(_t), id(_id) {}
  bool operator<(const node &o) const { return id > o.id; }
} sv[MAXN];
bool cmp(const node &a, const node &b) {
  if (a.t == b.t) return a.id < b.id;
  return a.t < b.t;
}
priority_queue<node> Q;
queue<int> qu;
set<int> mi;
long long ans[MAXN];
int main() {
  int n, p;
  scanf("%d%d", &n, &p);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &sv[i].t);
    sv[i].id = i;
  }
  sort(sv + 1, sv + 1 + n, cmp);
  long long now = -1;
  for (int i = 1; i <= n; i++) {
    while (!qu.empty() && now + p < sv[i].t) {
      now += p;
      mi.erase(qu.front());
      ans[qu.front()] = now;
      qu.pop();
      if (Q.empty()) continue;
      if (qu.empty() || Q.top().id < *(mi.begin())) {
        qu.push(Q.top().id);
        mi.insert(Q.top().id);
        Q.pop();
      }
    }
    Q.push(sv[i]);
    if (qu.empty())
      qu.push(Q.top().id), mi.insert(Q.top().id),
          now = max(now, 1LL * Q.top().t), Q.pop();
    else if (Q.top().id < *(mi.begin()))
      qu.push(Q.top().id), mi.insert(Q.top().id), Q.pop();
  }
  while (!qu.empty()) {
    now += p;
    mi.erase(qu.front());
    ans[qu.front()] = now;
    qu.pop();
    if (Q.empty()) continue;
    if (qu.empty() || Q.top().id < *(mi.begin())) {
      qu.push(Q.top().id);
      mi.insert(Q.top().id);
      Q.pop();
    }
  }
  for (int i = 1; i <= n; i++) printf("%lld ", ans[i]);
  puts("");
  return 0;
}
