func_code_string: #include <bits/stdc++.h>   using namespace std;   const int maxn = 1e5 + 9;   struct node {     int id;     long long t;     bool operator<(const node &A) const { return id > A.id; }   } e[maxn];   bool cmp(node a, node b) { return a.t < b.t || a.t == b.t && a.id < b.id; }   long long ans[maxn];   int tr[maxn];   void update(int p, int v) {     while (p < maxn) tr[p] += v, p += p & -p;   }   int query(int p) {     int res = 0;     while (p > 0) {       res += tr[p];       p -= p & -p;     }     return res;   }   int main() {     int n;     long long p;     scanf( %d%lld , &n, &p);     for (int i = 1; i <= n; i++) e[i].id = i, scanf( %lld , &e[i].t);     sort(e + 1, e + 1 + n, cmp);     priority_queue<node> W;     queue<node> Q;     int ar = 1;     long long t = 0;     while (ar <= n || !Q.empty() || !W.empty()) {       if (Q.empty() && W.empty()) {         t = e[ar].t;         update(e[ar].id, 1);         Q.push(e[ar++]);       }       if (Q.empty() && !W.empty()) {         update(W.top().id, 1);         Q.push(W.top());         W.pop();       }       if (!Q.empty()) {         node tmp = Q.front();         Q.pop();         t += p;         ans[tmp.id] = t;         while (ar <= n && e[ar].t <= t) {           if (query(e[ar].id - 1) == 0)             update(e[ar].id, 1), Q.push(e[ar++]);           else             W.push(e[ar++]);         }         update(tmp.id, -1);         while (!W.empty() && query(W.top().id - 1) == 0) {           tmp = W.top();           W.pop();           update(tmp.id, 1);           Q.push(tmp);         }       }     }     for (int i = 1; i <= n; i++) {       printf( %lld%c , ans[i],    n [i == n]);     }   }   