#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;
}
