Problem p02543 (C++) — buggy submission, verdict: Runtime Error

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

#define INF 1234567890
#define ll long long

int N, K, Q;
int X[200201];
int L[20][200201], R[20][200201];  //
ll LS[20][200201], RS[20][200201]; //
// LS[i][j] : j를 포함해서 만나는 2^i개의 정점의 번호 합

int main() {
  scanf("%d %d", &N, &K);
  for (int i = 1; i <= N; i++)
    scanf("%d", &X[i]);

  // L[] 채우기
  map<int, int> m;
  for (int i = 1; i <= N; i++) {
    m[X[i]] = i;
    auto it = m.upper_bound(X[i] - K);
    if (it == m.begin())
      continue;

    it = prev(it);
    L[0][i] = it->second;
  }

  m.clear();
  for (int i = N; i >= 1; i--) {
    m[X[i]] = i;
    auto it = m.lower_bound(X[i] + K);
    if (it == m.end())
      continue;

    R[0][i] = it->second;
  }

  for (int i = 1; i <= N; i++)
    LS[0][i] = RS[0][i] = i;

  for (int i = 1; i < 20; i++)
    for (int j = 1; j <= N; j++) {
      L[i][j] = L[i - 1][L[i - 1][j]];
      R[i][j] = R[i - 1][R[i - 1][j]];
      LS[i][j] = LS[i - 1][j] + LS[i - 1][L[i - 1][j]];
      RS[i][j] = RS[i - 1][j] + RS[i - 1][R[i - 1][j]];
    }

  scanf("%d", &Q);
  while (Q--) {
    int l, r;
    scanf("%d %d", &l, &r);
    ll ls = 0, rs = 0, cnt = 0;

    int n = r;
    for (int i = 19; i >= 0; i--)
      if (L[i][n] != 0 && l <= L[i][n])
        rs += LS[i][n], n = L[i][n], cnt += (1 << i);
    rs += LS[0][n];
    cnt++;

    n = l;
    for (int i = 19; i >= 0; i--)
      if (R[i][n] != 0 && R[i][n] <= r)
        ls += RS[i][n], n = R[i][n];
    ls += RS[0][n];

    // printf("%lld, %lld, %lld : ", rs, ls, cnt);
    printf("%lld\\n", rs - ls + cnt);
  }
  return 0;
}

Error: 0

Fixed submission:

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

#define INF 1234567890
#define ll long long

int N, K, Q;
int X[200201];
int L[20][101001], R[20][100101];
ll LS[20][100101], RS[20][100101];
// LS[i][j] : j를 포함해서 만나는 2^i개의 정점의 번호 합

int main() {
  scanf("%d %d", &N, &K);
  for (int i = 1; i <= N; i++)
    scanf("%d", &X[i]);

  // L[] 채우기
  map<int, int> m;
  for (int i = 1; i <= N; i++) {
    m[X[i]] = i;
    auto it = m.upper_bound(X[i] - K);
    if (it == m.begin())
      continue;

    it = prev(it);
    L[0][i] = it->second;
  }

  m.clear();
  for (int i = N; i >= 1; i--) {
    m[X[i]] = i;
    auto it = m.lower_bound(X[i] + K);
    if (it == m.end())
      continue;

    R[0][i] = it->second;
  }

  for (int i = 1; i <= N; i++)
    LS[0][i] = RS[0][i] = i;

  for (int i = 1; i < 20; i++)
    for (int j = 1; j <= N; j++) {
      L[i][j] = L[i - 1][L[i - 1][j]];
      R[i][j] = R[i - 1][R[i - 1][j]];
      LS[i][j] = LS[i - 1][j] + LS[i - 1][L[i - 1][j]];
      RS[i][j] = RS[i - 1][j] + RS[i - 1][R[i - 1][j]];
    }

  scanf("%d", &Q);
  while (Q--) {
    int l, r;
    scanf("%d %d", &l, &r);
    ll ls = 0, rs = 0, cnt = 0;

    int n = r;
    for (int i = 19; i >= 0; i--)
      if (L[i][n] != 0 && l <= L[i][n])
        rs += LS[i][n], n = L[i][n], cnt += (1 << i);
    rs += LS[0][n];
    cnt++;

    n = l;
    for (int i = 19; i >= 0; i--)
      if (R[i][n] != 0 && R[i][n] <= r)
        ls += RS[i][n], n = R[i][n];
    ls += RS[0][n];

    // printf("%lld, %lld, %lld : ", rs, ls, cnt);
    printf("%lld\\n", rs - ls + cnt);
  }
  return 0;
}