#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
ios::sync_with_stdio(0), cin.tie(0);
int N; cin >> N;
ll P; cin >> P;
vector<ll> T(N);
for (int i = 0; i < N; i++) {
cin >> T[i];
}
vector<pair<ll, int>> evts; evts.reserve(N);
for (int i = 0; i < N; i++) {
evts.emplace_back(T[i], i);
}
sort(evts.begin(), evts.end());
auto eit = evts.begin();
vector<ll> ans(N);
vector<int> queueOrder; queueOrder.reserve(N);
auto qit = queueOrder.begin();
set<int> queueInds;
set<int> waiting;
ll lastWater = 0;
while (eit != evts.end() || !queueInds.empty()) {
assert(int(queueInds.size()) == int(queueOrder.end() - qit));
// 0: somebody in the queue gets water
// 1: somebody starts waiting
int t = -1;
if (eit == evts.end()) {
t = 0;
} else if (queueInds.empty()) {
t = 1;
} else if (lastWater + P < eit->first) {
t = 0;
} else {
t = 1;
}
assert(t != -1);
//cerr << "t = " << t << '\n';
if (t == 0) {
lastWater += P;
int i = *qit;
//cerr << i << " gets water" << '\n';
ans[i] = lastWater;
assert(queueInds.count(i));
queueInds.erase(i);
qit++;
} else {
if (queueInds.empty()) {
lastWater = eit->first;
}
int i = eit->second;
//cerr << i << " starts waiting" << '\n';
waiting.insert(i);
eit++;
}
if (!waiting.empty()) {
int i = *waiting.begin();
if (queueInds.empty() || i < *queueInds.begin()) {
//cerr << i << " enters queue" << '\n';
queueOrder.push_back(i);
queueInds.insert(i);
waiting.erase(waiting.begin());
}
}
}
for (int i = 0; i < N; i++) {
cout << ans[i] << " \n"[i+1==N];
}
return 0;
}