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

const long long MOD = 1e9 + 7;
const long long INF = 1e9;
const long long INFLL = 1e18;

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<vector<int>> vvi;
typedef vector<ll> vll;
typedef complex<double> cd;

#define forn(i, n) for (int(i) = 0; (i) != (n); (i)++)
#define all(v) (v).begin(), (v).end()
#define rall(v) (v).rbegin(), (v).rend()
#define popcount(x) __builtin_popcount(x)
#define popcountll(x) __builtin_popcountll(x)
#define fi first
#define se second
#define re return
#define pb push_back
#define uniq(x)                                                                \\
  sort(all(x));                                                                \\
  (x).resize(unique(all(x)) - (x).begin())

#ifdef LOCAL
#define dbg(x) cerr << __LINE__ << " " << #x << " " << x << endl
#define ln cerr << __LINE__ << endl
#else
#define dbg(x) void(0)
#define ln void(0)
#endif // LOCAL

const int N = 200000;

int canL[N], canR[N];

signed main() {
  srand(time(NULL));
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);

  ll n, k;
  cin >> n >> k;
  vector<int> x(n + 1);
  forn(i, n) cin >> x[i + 1];
  vector<vector<ll>> goR(20, vector<ll>(n + 2));
  vector<vector<ll>> goL(20, vector<ll>(n + 2));
  vector<vector<ll>> summR(20, vector<ll>(n + 2));
  vector<vector<ll>> summL(20, vector<ll>(n + 2));
  for (int i = 1, j = 1; i <= n; i++) {
    while (j <= n && x[j] - x[i] < k) {
      j++;
    }
    goR[0][i] = j;
  }
  goR[0][0] = 1;
  goR[0][n + 1] = n + 1;
  summR[0] = goR[0];
  for (int i = n, j = n; i >= 1; i--) {
    while (j >= 1 && x[i] - x[j] < k) {
      j--;
    }
    goL[0][i] = j;
  }
  goL[0][0] = 0;
  goL[0][n + 1] = n;
  summL[0] = goL[0];
  for (int j = 1; j < 20; j++) {
    for (int i = 0; i <= n + 1; i++) {
      goR[j][i] = goR[j - 1][goR[j - 1][i]];
      goL[j][i] = goL[j - 1][goL[j - 1][i]];
      summR[j][i] = summR[j - 1][i] + summR[j - 1][goR[j - 1][i]];
      summL[j][i] = summL[j - 1][i] + summL[j - 1][goL[j - 1][i]];
    }
  }
  int q;
  cin >> q;
  while (q--) {
    int l, r;
    cin >> l >> r;
    int sz = 1;
    int w = l;
    for (int j = 19; j >= 0; j--) {
      int nxt = goR[j][w];
      if (nxt <= r) {
        w = nxt;
        sz += (1 << j);
      }
    }
    ll ans = 0;
    {
      ll w = r;
      ll si = r;
      for (int j = 19; j >= 0; j--) {
        ll go = goL[j][w];
        if (l <= go) {
          si += summL[j][w];
          w = go;
        }
      }
      ans += si;
    }
    {
      ll w = l;
      ll si = l;
      for (int j = 19; j >= 0; j--) {
        ll go = goR[j][w];
        if (go <= r) {
          si += summR[j][w];
          w = go;
        }
      }
      ans -= si;
    }
    cout << sz + ans << "\\n";
  }
}

/* Note:
Check constants at the beginning of the code (MOD, INF, INFLL)
Check corner cases.
    N = 1
No def int long long for now.
Add something here.
*/


Error: TLE

Fixed submission:

const long long MOD = 1e9 + 7;
const long long INF = 1e9;
const long long INFLL = 1e18;

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<vector<int>> vvi;
typedef vector<ll> vll;
typedef complex<double> cd;

#define forn(i, n) for (int(i) = 0; (i) != (n); (i)++)
#define all(v) (v).begin(), (v).end()
#define rall(v) (v).rbegin(), (v).rend()
#define popcount(x) __builtin_popcount(x)
#define popcountll(x) __builtin_popcountll(x)
#define fi first
#define se second
#define re return
#define pb push_back
#define uniq(x)                                                                \\
  sort(all(x));                                                                \\
  (x).resize(unique(all(x)) - (x).begin())

#ifdef LOCAL
#define dbg(x) cerr << __LINE__ << " " << #x << " " << x << endl
#define ln cerr << __LINE__ << endl
#else
#define dbg(x) void(0)
#define ln void(0)
#endif // LOCAL

const int N = 200000;

int canL[N], canR[N];

signed main() {
  srand(time(NULL));
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);

  ll n, k;
  cin >> n >> k;
  vector<int> x(n + 1);
  forn(i, n) cin >> x[i + 1];
  vector<vector<int>> goR(20, vector<int>(n + 2));
  vector<vector<int>> goL(20, vector<int>(n + 2));
  for (int i = 1, j = 1; i <= n; i++) {
    while (j <= n && x[j] - x[i] < k) {
      j++;
    }
    goR[0][i] = j;
  }
  goR[0][0] = 1;
  goR[0][n + 1] = n + 1;
  for (int i = n, j = n; i >= 1; i--) {
    while (j >= 1 && x[i] - x[j] < k) {
      j--;
    }
    goL[0][i] = j;
  }
  goL[0][0] = 0;
  goL[0][n + 1] = n;
  for (int j = 1; j < 20; j++) {
    for (int i = 0; i <= n + 1; i++) {
      goR[j][i] = goR[j - 1][goR[j - 1][i]];
      goL[j][i] = goL[j - 1][goL[j - 1][i]];
    }
  }
  int q;
  cin >> q;
  while (q--) {
    int l, r;
    cin >> l >> r;
    int sz = 1;
    int w = l;
    for (int j = 19; j >= 0; j--) {
      int nxt = goR[j][w];
      if (nxt <= r) {
        w = nxt;
        sz += (1 << j);
      }
    }
    // cout << "Size of good set = " << sz << "\\n";
    int ans = 0;
    for (int i = l; i <= r; i++) {
      canL[i] = 0;
      int pr = goL[0][i];
      if (pr < l)
        continue;
      canL[i] = canL[pr] + 1;
    }
    for (int i = r; i >= l; i--) {
      canR[i] = 0;
      int nx = goR[0][i];
      if (nx > r)
        continue;
      canR[i] = canR[nx] + 1;
    }
    for (int i = l; i <= r; i++) {
      if (canL[i] + canR[i] + 1 == sz)
        ans++;
    }
    cout << ans << "\\n";
  }
}

/* Note:
Check constants at the beginning of the code (MOD, INF, INFLL)
Check corner cases.
    N = 1
No def int long long for now.
Add something here.
*/