Problem p02647 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <bits/stdc++.h>
using namespace std;

#define FOR(i, a, b) for (int i = (a); i < (b); ++i)
#define F0R(i, a) FOR(i, 0, a)
#define ROF(i, a, b) for (int i = (b)-1; i >= (a); --i)
#define R0F(i, a) ROF(i, 0, a)

using ll = long long;
using ld = long double;
ll INF = LLONG_MAX;

using vi = vector<int>;
using vll = vector<ll>;
using pii = pair<int, int>;

namespace output {
void pr(int x) { cout << x; }
void pr(long x) { cout << x; }
void pr(ll x) { cout << x; }
void pr(unsigned x) { cout << x; }
void pr(unsigned long x) { cout << x; }
void pr(unsigned long long x) { cout << x; }
void pr(float x) { cout << x; }
void pr(double x) { cout << x; }
void pr(ld x) { cout << x; }
void pr(char x) { cout << x; }
void pr(const char *x) { cout << x; }
void pr(const string &x) { cout << x; }
void pr(bool x) { pr(x ? "true" : "false"); }
template <class T> void pr(const complex<T> &x) { cout << x; }

template <class T1, class T2> void pr(const pair<T1, T2> &x);
template <class T> void pr(const T &x);

template <class T, class... Ts> void pr(const T &t, const Ts &...ts) {
  pr(t);
  pr(ts...);
}
template <class T1, class T2> void pr(const pair<T1, T2> &x) {
  pr("{", x.first, ", ", x.second, "}");
}
template <class T> void pr(const T &x) {
  pr("{"); // const iterator needed for vector<bool>
  bool fst = 1;
  for (const auto &a : x)
    pr(!fst ? ", " : "", a), fst = 0;
  pr("}");
}

void print() { pr("\\n"); } // print w/ spaces
template <class T, class... Ts> void print(const T &t, const Ts &...ts) {
  pr(t);
  if (sizeof...(ts))
    pr(" ");
  print(ts...);
}
} // namespace output

using namespace output;

int main() {
  // ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  int N, K;
  cin >> N >> K;
  vi arr(N);
  F0R(i, N) cin >> arr[i];

  vi temp(N);
  set<pii> cover;

  F0R(i, K) {
    vi old = arr;
    // one op
    priority_queue<pii> cover;
    R0F(j, N) {
      cover.push({j - arr[j], j});
      while (cover.size() > 0 && cover.top() > (pii){j, N})
        cover.pop();
      temp[j] = cover.size();
    }
    priority_queue<pii, vector<pii>, greater<pii>> other;
    F0R(j, N) {
      while (other.size() > 0 && other.top() < (pii){j, 0})
        other.pop();
      int ilum = other.size() + temp[j];
      other.push({j + arr[j], j});
      arr[j] = ilum;
    }
    bool done = true;
    for (int x : arr)
      if (x != N)
        done = false;
    if (done)
      break;
  }
  for (int x : arr)
    cout << x << " ";
  cout << endl;
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;

#define FOR(i, a, b) for (int i = (a); i < (b); ++i)
#define F0R(i, a) FOR(i, 0, a)
#define ROF(i, a, b) for (int i = (b)-1; i >= (a); --i)
#define R0F(i, a) ROF(i, 0, a)

using ll = long long;
using ld = long double;
ll INF = LLONG_MAX;

using vi = vector<int>;
using vll = vector<ll>;
using pii = pair<int, int>;

namespace output {
void pr(int x) { cout << x; }
void pr(long x) { cout << x; }
void pr(ll x) { cout << x; }
void pr(unsigned x) { cout << x; }
void pr(unsigned long x) { cout << x; }
void pr(unsigned long long x) { cout << x; }
void pr(float x) { cout << x; }
void pr(double x) { cout << x; }
void pr(ld x) { cout << x; }
void pr(char x) { cout << x; }
void pr(const char *x) { cout << x; }
void pr(const string &x) { cout << x; }
void pr(bool x) { pr(x ? "true" : "false"); }
template <class T> void pr(const complex<T> &x) { cout << x; }

template <class T1, class T2> void pr(const pair<T1, T2> &x);
template <class T> void pr(const T &x);

template <class T, class... Ts> void pr(const T &t, const Ts &...ts) {
  pr(t);
  pr(ts...);
}
template <class T1, class T2> void pr(const pair<T1, T2> &x) {
  pr("{", x.first, ", ", x.second, "}");
}
template <class T> void pr(const T &x) {
  pr("{"); // const iterator needed for vector<bool>
  bool fst = 1;
  for (const auto &a : x)
    pr(!fst ? ", " : "", a), fst = 0;
  pr("}");
}

void print() { pr("\\n"); } // print w/ spaces
template <class T, class... Ts> void print(const T &t, const Ts &...ts) {
  pr(t);
  if (sizeof...(ts))
    pr(" ");
  print(ts...);
}
} // namespace output

using namespace output;

int main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  int N, K;
  cin >> N >> K;
  vi arr(N);
  F0R(i, N) cin >> arr[i];

  vi temp(N);
  set<pii> cover;

  F0R(i, K) {
    // one op
    cover.clear();

    R0F(j, N) {
      cover.insert({j - arr[j], j});
      while (cover.size() > 0 && (*cover.rbegin()) > (pii){j, N}) {
        auto it = cover.end();
        --it;
        cover.erase(it);
      }
      temp[j] = cover.size();
    }

    cover.clear();
    F0R(j, N) {
      while (cover.size() > 0 && (*cover.begin()) < (pii){j, 0})
        cover.erase(cover.begin());
      int ilum = cover.size() + temp[j];
      cover.insert({j + arr[j], j});
      arr[j] = ilum;
    }

    bool done = true;
    for (int x : arr)
      if (x != N)
        done = false;
    if (done)
      break;
  }
  for (int x : arr)
    cout << x << " ";
  cout << endl;
}