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

#pragma GCC optimize("O3", "unroll-loops")
#pragma GCC target("avx")
#include <bits/stdc++.h>
using namespace std;
// using namespace atcoder;
struct fast_ios {
  fast_ios() {
    cin.tie(0);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(20);
  };
} fast_ios_;
#define FOR(i, begin, end) for (int i = (begin); i < (end); i++)
#define REP(i, n) FOR(i, 0, n)
#define IFOR(i, begin, end) for (int i = (end)-1; i >= (begin); i--)
#define IREP(i, n) IFOR(i, 0, n)
#define Sort(v) sort(v.begin(), v.end())
#define Reverse(v) reverse(v.begin(), v.end())
#define all(v) v.begin(), v.end()
#define SZ(v) ((int)v.size())
#define Lower_bound(v, x)                                                      \\
  distance(v.begin(), lower_bound(v.begin(), v.end(), x))
#define Upper_bound(v, x)                                                      \\
  distance(v.begin(), upper_bound(v.begin(), v.end(), x))
#define chmax(a, b) a = max(a, b)
#define chmin(a, b) a = min(a, b)
#define bit(n) (1LL << (n))
#define debug(x) cout << #x << "=" << x << endl;
#define vdebug(v)                                                              \\
  {                                                                            \\
    cout << #v << "=" << endl;                                                 \\
    REP(i_debug, v.size()) { cout << v[i_debug] << ","; }                      \\
    cout << endl;                                                              \\
  }
#define mdebug(m)                                                              \\
  {                                                                            \\
    cout << #m << "=" << endl;                                                 \\
    REP(i_debug, m.size()) {                                                   \\
      REP(j_debug, m[i_debug].size()) { cout << m[i_debug][j_debug] << ","; }  \\
      cout << endl;                                                            \\
    }                                                                          \\
  }
#define pb push_back
#define fi first
#define se second
#define int long long
#define INF 1000000000000000000
template <typename T> istream &operator>>(istream &is, vector<T> &v) {
  for (auto &x : v)
    is >> x;
  return is;
}
template <typename T> ostream &operator<<(ostream &os, vector<T> &v) {
  for (int i = 0; i < v.size(); i++) {
    cout << v[i];
    if (i != v.size() - 1)
      cout << endl;
  };
  return os;
}
template <typename T1, typename T2>
ostream &operator<<(ostream &os, pair<T1, T2> p) {
  cout << '(' << p.first << ',' << p.second << ')';
  return os;
}
template <typename T> void Out(T x) { cout << x << endl; }
template <typename T1, typename T2> void chOut(bool f, T1 y, T2 n) {
  if (f)
    Out(y);
  else
    Out(n);
}

using vec = vector<int>;
using mat = vector<vec>;
using Pii = pair<int, int>;
using v_bool = vector<bool>;
using v_Pii = vector<Pii>;

// int dx[4] = {1,0,-1,0};
// int dy[4] = {0,1,0,-1};
// char d[4] = {'D','R','U','L'};

const int mod = 1000000007;
// const int mod = 998244353;

signed main() {

  int N, K;
  cin >> N >> K;
  vec X(N);
  cin >> X;
  int Q;
  cin >> Q;

  vector<v_Pii> next(18, v_Pii(N, Pii(N, 0))), prev(18, v_Pii(N, Pii(-1, 0)));
  REP(i, N) {
    int j = Lower_bound(X, X[i] + K);
    if (j < N)
      next[0][i] = Pii(j, j);
    int k = Upper_bound(X, X[i] - K) - 1;
    if (k >= 0)
      prev[0][i] = Pii(k, k);
  }
  FOR(t, 1, 18) {
    REP(i, N) if (next[t - 1][i].fi < N) {
      int v = next[t - 1][next[t - 1][i].fi].fi;
      int cost = next[t - 1][i].se + next[t - 1][next[t - 1][i].fi].se;
      next[t][i] = Pii(v, cost);
    }
    REP(i, N) if (prev[t - 1][i].fi >= 0) {
      int v = prev[t - 1][prev[t - 1][i].fi].fi;
      int cost = prev[t - 1][i].se + prev[t - 1][prev[t - 1][i].fi].se;
      prev[t][i] = Pii(v, cost);
    }
  }
  // mdebug(next); mdebug(prev);

  vec ans(Q);
  REP(q, Q) {
    int L, R;
    cin >> L >> R;
    L--;
    R--;

    int nl = 1, cl = L;
    int now = L;
    IREP(t, 18) if (next[t][now].fi <= R) {
      nl += bit(t);
      cl += next[t][now].se;
      now = next[t][now].fi;
    }

    int nr = 1, cr = R;
    now = R;
    IREP(t, 18) if (prev[t][now].fi >= L) {
      nr += bit(t);
      cr += prev[t][now].se;
      now = prev[t][now].fi;
    }
    ans[q] = cr - cl + nl;
  }
  REP(i, Q) cout << ans[i] << '\\n';

  return 0;
}


Error: TLE

Fixed submission:

#pragma GCC optimize("O3", "unroll-loops")
#pragma GCC target("avx")
#include <bits/stdc++.h>
using namespace std;
// using namespace atcoder;
struct fast_ios {
  fast_ios() {
    cin.tie(0);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(20);
  };
} fast_ios_;
#define FOR(i, begin, end) for (int i = (begin); i < (end); i++)
#define REP(i, n) FOR(i, 0, n)
#define IFOR(i, begin, end) for (int i = (end)-1; i >= (begin); i--)
#define IREP(i, n) IFOR(i, 0, n)
#define Sort(v) sort(v.begin(), v.end())
#define Reverse(v) reverse(v.begin(), v.end())
#define all(v) v.begin(), v.end()
#define SZ(v) ((int)v.size())
#define Lower_bound(v, x)                                                      \\
  distance(v.begin(), lower_bound(v.begin(), v.end(), x))
#define Upper_bound(v, x)                                                      \\
  distance(v.begin(), upper_bound(v.begin(), v.end(), x))
#define chmax(a, b) a = max(a, b)
#define chmin(a, b) a = min(a, b)
#define bit(n) (1LL << (n))
#define debug(x) cout << #x << "=" << x << endl;
#define vdebug(v)                                                              \\
  {                                                                            \\
    cout << #v << "=" << endl;                                                 \\
    REP(i_debug, v.size()) { cout << v[i_debug] << ","; }                      \\
    cout << endl;                                                              \\
  }
#define mdebug(m)                                                              \\
  {                                                                            \\
    cout << #m << "=" << endl;                                                 \\
    REP(i_debug, m.size()) {                                                   \\
      REP(j_debug, m[i_debug].size()) { cout << m[i_debug][j_debug] << ","; }  \\
      cout << endl;                                                            \\
    }                                                                          \\
  }
#define pb push_back
#define fi first
#define se second
#define int long long
#define INF 1000000000000000000
template <typename T> istream &operator>>(istream &is, vector<T> &v) {
  for (auto &x : v)
    is >> x;
  return is;
}
template <typename T> ostream &operator<<(ostream &os, vector<T> &v) {
  for (int i = 0; i < v.size(); i++) {
    cout << v[i];
    if (i != v.size() - 1)
      cout << endl;
  };
  return os;
}
template <typename T1, typename T2>
ostream &operator<<(ostream &os, pair<T1, T2> p) {
  cout << '(' << p.first << ',' << p.second << ')';
  return os;
}
template <typename T> void Out(T x) { cout << x << endl; }
template <typename T1, typename T2> void chOut(bool f, T1 y, T2 n) {
  if (f)
    Out(y);
  else
    Out(n);
}

using vec = vector<int>;
using mat = vector<vec>;
using Pii = pair<int, int>;
using v_bool = vector<bool>;
using v_Pii = vector<Pii>;

// int dx[4] = {1,0,-1,0};
// int dy[4] = {0,1,0,-1};
// char d[4] = {'D','R','U','L'};

const int mod = 1000000007;
// const int mod = 998244353;

signed main() {

  int N, K;
  cin >> N >> K;
  vec X(N);
  cin >> X;
  int Q;
  cin >> Q;

  vector<v_Pii> next(18, v_Pii(N, Pii(N, 0))), prev(18, v_Pii(N, Pii(-1, 0)));
  REP(i, N) {
    int j = Lower_bound(X, X[i] + K);
    if (j < N)
      next[0][i] = Pii(j, j);
    int k = Upper_bound(X, X[i] - K) - 1;
    if (k >= 0)
      prev[0][i] = Pii(k, k);
  }
  FOR(t, 1, 18) {
    REP(i, N) if (next[t - 1][i].fi < N) {
      int v = next[t - 1][next[t - 1][i].fi].fi;
      int cost = next[t - 1][i].se + next[t - 1][next[t - 1][i].fi].se;
      next[t][i] = Pii(v, cost);
    }
    REP(i, N) if (prev[t - 1][i].fi >= 0) {
      int v = prev[t - 1][prev[t - 1][i].fi].fi;
      int cost = prev[t - 1][i].se + prev[t - 1][prev[t - 1][i].fi].se;
    }
  }
  // mdebug(next); mdebug(prev);

  vec ans(Q);
  REP(q, Q) {
    int L, R;
    cin >> L >> R;
    L--;
    R--;

    int nl = 1, cl = L;
    int now = L;
    while (next[0][now].fi <= R) {
      IREP(t, 18) if (next[t][now].fi <= R) {
        nl += bit(t);
        cl += next[t][now].se;
        now = next[t][now].fi;
        break;
      }
    }
    int nr = 1, cr = R;
    now = R;
    while (prev[0][now].fi >= L) {
      IREP(t, 18) if (prev[t][now].fi >= L) {
        nr += bit(t);
        cr += prev[t][now].se;
        now = prev[t][now].fi;
        break;
      }
    }
    ans[q] = cr - cl + nl;
  }
  REP(i, Q) cout << ans[i] << '\\n';

  return 0;
}