#include <bits/stdc++.h>
using namespace std;
struct Node {
  int pos;
  int w;
} a[100005];
bool cmp(Node x, Node y) { return x.w == y.w ? x.pos < y.pos : x.w < y.w; }
bool operator<(const Node &x, const Node &y) { return x.pos > y.pos; }
priority_queue<Node> pq;
queue<Node> q;
set<int> s;
long long ans[100005];
int main() {
  int n, tot = 1, k;
  scanf("%d%d", &n, &k);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i].w);
    a[i].pos = i;
  }
  sort(a + 1, a + n + 1, cmp);
  long long tim = a[1].w;
  s.insert(n + 1);
  while (tot <= n || !q.empty() || !pq.empty()) {
    if (!q.empty()) {
      Node now = q.front();
      q.pop();
      tim += k;
      ans[now.pos] = tim;
      while (tot <= n && a[tot].w < tim) {
        if (a[tot].pos < (*s.begin())) {
          s.insert(a[tot].pos);
          q.push(a[tot]);
          tot++;
        } else {
          pq.push(a[tot]);
          tot++;
        }
      }
      s.erase(now.pos);
    }
    if (q.empty() && pq.empty()) {
      tim = max(tim, (long long)a[tot].w);
    }
    while (tot <= n && a[tot].w <= tim) {
      pq.push(a[tot]);
      tot++;
    }
    int mn = *s.begin();
    if (!pq.empty() && pq.top().pos <= mn) {
      Node now = pq.top();
      pq.pop();
      q.push(now);
      s.insert(now.pos);
    }
  }
  for (int i = 1; i <= n; i++) printf("%lld ", ans[i]);
}
