Problem p04052 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long int ull;
typedef /*long long*/ int ll;
typedef pair<ll, ll> pll;
typedef long double D;
// typedef complex<D> P;
#define F first
#define S second
const ll MOD = 1000000007;
// const ll MOD=998244353;

template <typename T, typename U>
istream &operator>>(istream &i, pair<T, U> &A) {
  i >> A.F >> A.S;
  return i;
}
template <typename T> istream &operator>>(istream &i, vector<T> &A) {
  for (auto &I : A) {
    i >> I;
  }
  return i;
}
template <typename T, typename U>
ostream &operator<<(ostream &o, const pair<T, U> &A) {
  o << A.F << " " << A.S;
  return o;
}
template <typename T> ostream &operator<<(ostream &o, const vector<T> &A) {
  int i = A.size();
  for (auto &I : A) {
    o << I << (--i ? " " : "");
  }
  return o;
}

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  ll N, K;
  cin >> N >> K;
  vector<ll> A(N), B(N);
  cin >> A;
  vector<ll> bef(N);
  vector<ll> ans(N);
  for (int i = 0; i < N; i++) {
    A[i]--;
    B[A[i]] = i;
  }
  for (int i = 1; i < N; i++) {
    for (int j = 0; j + i < N; j += i << 1) {
      int lf = j, mid = j + i, rg = min<ll>(N, j + (i << 1));
      priority_queue<pll, vector<pll>, greater<pll>> Q1, Q2;
      for (int k = lf; k < mid; k++) {
        Q1.push({B[k], k - lf});
      }
      for (int k = mid; k < rg; k++) {
        Q2.push({B[k], k - mid});
      }

      int mx = -1;
      while (!Q2.empty()) {
        pll a = Q2.top();
        Q2.pop();
        while (!Q1.empty() && Q1.top().F < a.F + K) {
          mx = max<ll>(mx, Q1.top().S);
          Q1.pop();
        }
        bef[a.S] = mx;
      }
      for (int k = 1; k < rg - mid; k++) {
        bef[k] = max(bef[k], bef[k - 1]);
      }
      int idx = 0;
      int k = 0;
      for (int l = 0; l < mid - lf; l++) {
        while (k < rg - mid && bef[k] < l) {
          ans[idx++] = B[k + mid];
          k++;
        }
        ans[idx++] = B[l + lf];
      }
      for (int i = 0; i < idx; i++) {
        B[lf + i] = ans[i];
      }
    }
  }
  for (int i = 0; i < N; i++) {
    A[B[i]] = i;
  }
  for (auto &I : A) {
    cout << I + 1 << endl;
  }

  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long int ull;
typedef /*long long*/ int ll;
typedef pair<ll, ll> pll;
typedef long double D;
// typedef complex<D> P;
#define F first
#define S second
const ll MOD = 1000000007;
// const ll MOD=998244353;

template <typename T, typename U>
istream &operator>>(istream &i, pair<T, U> &A) {
  i >> A.F >> A.S;
  return i;
}
template <typename T> istream &operator>>(istream &i, vector<T> &A) {
  for (auto &I : A) {
    i >> I;
  }
  return i;
}
template <typename T, typename U>
ostream &operator<<(ostream &o, const pair<T, U> &A) {
  o << A.F << " " << A.S;
  return o;
}
template <typename T> ostream &operator<<(ostream &o, const vector<T> &A) {
  int i = A.size();
  for (auto &I : A) {
    o << I << (--i ? " " : "");
  }
  return o;
}

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  ll N, K;
  cin >> N >> K;
  vector<ll> A(N), B(N);
  cin >> A;
  vector<ll> bef(N);
  vector<ll> ans(N);
  for (int i = 0; i < N; i++) {
    A[i]--;
    B[A[i]] = i;
  }
  for (int i = 1; i < N; i <<= 1) {
    for (int j = 0; j + i < N; j += i << 1) {
      int lf = j, mid = j + i, rg = min<ll>(N, j + (i << 1));
      priority_queue<pll, vector<pll>, greater<pll>> Q1, Q2;
      for (int k = lf; k < mid; k++) {
        Q1.push({B[k], k - lf});
      }
      for (int k = mid; k < rg; k++) {
        Q2.push({B[k], k - mid});
      }

      int mx = -1;
      while (!Q2.empty()) {
        pll a = Q2.top();
        Q2.pop();
        while (!Q1.empty() && Q1.top().F < a.F + K) {
          mx = max<ll>(mx, Q1.top().S);
          Q1.pop();
        }
        bef[a.S] = mx;
      }
      for (int k = 1; k < rg - mid; k++) {
        bef[k] = max(bef[k], bef[k - 1]);
      }
      int idx = 0;
      int k = 0;
      for (int l = 0; l < mid - lf; l++) {
        while (k < rg - mid && bef[k] < l) {
          ans[idx++] = B[k + mid];
          k++;
        }
        ans[idx++] = B[l + lf];
      }
      for (int i = 0; i < idx; i++) {
        B[lf + i] = ans[i];
      }
    }
  }
  for (int i = 0; i < N; i++) {
    A[B[i]] = i;
  }
  for (auto &I : A) {
    cout << I + 1 << endl;
  }

  return 0;
}