#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,p,now,ds,cnt=1,cntsum,cntbyd;
struct node{
ll two;
ll t,id;
bool operator < (const node &x)const{
return t>x.t;
}
}ed[100010],sum[100010],byd[100010];
struct node1{
ll two;
ll t,id;
}c;
struct node2{
ll id,num;
}ans[100010];
bool cmp(node2 x,node2 y){
return x.id<y.id;
}
deque<node1> mq;
priority_queue<node> mq1;
int main(){
cin>>n>>p;
for(int i=1;i<=n;i++){
cin>>ed[i].t;
ed[i].id=i;
}
for(int i=1;i<=n;i++){
mq1.push(ed[i]);
}
now=ed[1].t+p;
node ppp=mq1.top();
mq1.pop();
node1 pp;
pp.id=ppp.id;pp.t=ppp.t;pp.two=ppp.two;
mq.push_front(pp);
ans[cnt].id=pp.id;
ans[cnt].num=now;
while(cnt<n){
cntbyd=0;
cntsum=0;
if(mq.empty()&&!mq1.empty()){
node b=mq1.top();
mq1.pop();
b.two=0;
c.two=b.two;
c.id=b.id;
c.t=b.t;
mq.push_front(c);
}
if(ds==1){
node1 x=mq.back();
mq.pop_back();
ans[++cnt].id=x.id;
now+=p;
ans[cnt].num=now;
ds=0;
}
node a=mq1.top();
while(a.t<=now&&!mq1.empty()){
a=mq1.top();
mq1.pop();
a.two=1;
sum[++cntsum]=a;
}
for(int i=1;i<=cntsum;i++){
mq1.push(sum[i]);
}
node1 minn=mq.front();
node minm=mq1.top();
node minx;
minx.id=1000100;
while(!mq1.empty()){
minm=mq1.top();
if(minm.id<minn.id){
if(minm.two==1){
mq1.pop();
minm.two=0;
if(minx.id>minm.id){
minx.id=minm.id;
minx.t=minm.t;
minx.two=minm.two;
}
}else{
byd[++cntbyd]=mq1.top();
mq1.pop();
}
}else{
byd[++cntbyd]=mq1.top();
mq1.pop();
}
}
minn.id=minx.id;
minn.t=minx.t;
minn.two=minx.two;
mq.push_front(minn);
for(int i=1;i<=cntbyd;i++){
mq1.push(byd[i]);
}
if(ds==0){
ds=1;
}
}
sort(ans+1,ans+1+n,cmp);
for(int i=1;i<=n;i++){
cout<<ans[i].num<<" ";
}
return 0;
}