Problem p04017 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;

#define NDEBUG
#ifdef DEBUG
#include "../cout11.h"
#undef NDEBUG
#endif
#include <cassert>

typedef long long ll;
typedef long double Double;
typedef unsigned long long ull;
typedef pair<int, int> ii;
typedef pair<ll, ll> llll;
typedef pair<double, double> dd;

typedef vector<int> vi;
typedef vector<vector<int>> vvi;
typedef vector<ii> vii;
typedef vector<vector<ii>> vvii;
typedef vector<ll> vll;
typedef vector<string> vs;
typedef vector<double> vd;
typedef vector<long double> vD;

#define sz(a) int((a).size())
#define pb push_back
#define FOR(var, from, to) for (int var = (from); var <= (to); ++var)
#define rep(var, n) for (int var = 0; var < (n); ++var)
#define rep1(var, n) for (int var = 1; var <= (n); ++var)
#define repC2(vari, varj, n)                                                   \
  for (int vari = 0; vari < (n)-1; ++vari)                                     \
    for (int varj = vari + 1; varj < (n); ++varj)
#define ALL(c) (c).begin(), (c).end()
#define RALL(c) (c).rbegin(), (c).rend()
#define tr(i, c) for (auto i = (c).begin(); i != (c).end(); ++i)
#define found(s, e) ((s).find(e) != (s).end())
#define mset(arr, val) memset(arr, val, sizeof(arr))
#define mid(x, y) ((x) + ((y) - (x)) / 2)
#define IN(x, a, b) ((a) <= (x) && (x) <= (b))
#define cons make_pair

ll gcd(ll a, ll b) {
  while (a)
    swap(a, b %= a);
  return b;
}

const ll MOD = 1000000007LL;

ll ADD(ll x, ll y) { return (x + y) % MOD; }
ll SUB(ll x, ll y) { return (x - y + MOD) % MOD; }
ll MUL(ll x, ll y) { return x * y % MOD; }
ll POW(ll x, ll e) {
  ll v = 1;
  for (; e; x = MUL(x, x), e >>= 1)
    if (e & 1)
      v = MUL(v, x);
  return v;
}
ll DIV(ll x, ll y) { /*assert(y%MOD!=0);*/
  return MUL(x, POW(y, MOD - 2));
}
// ll comb(ll n, ll k) { ll v=1; for(ll i=1; i<=k; i++) v = DIV(MUL(v,
// n-i+1),i); return v; }
//

#define INTSPACE 12
char _buf[INTSPACE * 1000000 + 3];

int loadint() {
  if (fgets(_buf, INTSPACE + 3, stdin) == NULL)
    return 0;
  return atoi(_buf);
}

int loadvec(vector<int> &v, int N = -1) {
  if (N == -1) {
    N = loadint();
    if (N == 0)
      return 0;
  }
  int bufsize = INTSPACE * N + 3;
  if (fgets(_buf, bufsize, stdin) == NULL)
    return 0;
  v.resize(N);

  int i = 0;
  bool last = false;
  for (char *p = &_buf[0];;) {
    char *q = p;
    while (*q > ' ')
      ++q;
    if (*q == 0x0D || *q == 0x0A)
      last = true;
    *q = 0;
    v[i++] = atoi(p);
    if (last || i == N)
      break;
    p = q + 1;
  }
  // assert(i <= N);
  return i;
}
void read_cr() { fgets(_buf, 256, stdin); }

int N, L, Q;
vi x;

vvi reach;
int R;

void prepare() {
  R = 0;
  for (int x = N; x > 0; x /= 2)
    ++R;
  reach.resize(R);

#ifdef DEBUG
  cerr << "prep. N=" << N << x << " L=" << L << ", R=" << R << endl;
#endif

  reach[0].resize(N);
  rep(i, N) {
    auto it = lower_bound(ALL(x), x[i] + L + 1);
    reach[0][i] = (int)(it - x.begin() - 1);
  }
#ifdef DEBUG
  cerr << "1:" << reach[0] << endl;
#endif
  for (int l = 1, d = 2; d < N; ++l, d *= 2) {
    reach[l].resize(N);
    rep(i, N) {
      int hop = reach[l - 1][i];
      if (hop == N) {
        reach[l][i] = N;
      } else {
        int step = reach[l - 1][hop];
        reach[l][i] = (step == hop) ? N : step;
      }
    }
#ifdef DEBUG
    cerr << d << ":" << reach[l] << endl;
#endif
  }
}

ii step(int from, int to) { // (moves, curr)
  assert(from <= to);
  if (from == to)
    return ii(0, to);

#ifdef DEBUG
  fprintf(stderr, "step(%d %d):", from, to);
#endif

  int moves = 0, curr = from;

  rep(l, R) {
    int r = reach[l][from];

#ifdef DEBUG
    fprintf(stderr, "  l=%d, r=%d\n", l, r);
#endif
    if (to < r) { // over
      break;
    }

    moves = 1 << l;
    curr = reach[l][from];
    // if (to == r) break;
  }
  return ii(moves, curr);
}
int query(int a, int b) {
  assert(IN(a, 1, N) && IN(b, 1, N) && a != b);
  --a;
  --b;
  if (a > b)
    swap(a, b);
  assert(a < b);
#ifdef DEBUG
  fprintf(stderr, "query(%d %d)..\n", a, b);
#endif

  int moves = 0;
  for (int curr = a; curr < b;) {
    ii m = step(curr, b);
#ifdef DEBUG
    fprintf(stderr, " => (moves=%d, curr=%d)\n", m.first, m.second);
#endif
    if (m.first == 0) {
      ++moves;
      break;
    }

    moves += m.first;
    curr = m.second;
  }
#ifdef DEBUG
  cerr << "moves=" << moves << endl;
#endif
  return moves;
}

int main() {
  N = loadvec(x);
  cin >> L;
  prepare();

  cin >> Q;
  rep(q, Q) {
    int a, b;
    cin >> a >> b;
    cout << query(a, b) << endl;
  }
  return 0;
}


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

#define NDEBUG
#ifdef DEBUG
#include "../cout11.h"
#undef NDEBUG
#endif
#include <cassert>

typedef long long ll;
typedef long double Double;
typedef unsigned long long ull;
typedef pair<int, int> ii;
typedef pair<ll, ll> llll;
typedef pair<double, double> dd;

typedef vector<int> vi;
typedef vector<vector<int>> vvi;
typedef vector<ii> vii;
typedef vector<vector<ii>> vvii;
typedef vector<ll> vll;
typedef vector<string> vs;
typedef vector<double> vd;
typedef vector<long double> vD;

#define sz(a) int((a).size())
#define pb push_back
#define FOR(var, from, to) for (int var = (from); var <= (to); ++var)
#define rep(var, n) for (int var = 0; var < (n); ++var)
#define rep1(var, n) for (int var = 1; var <= (n); ++var)
#define repC2(vari, varj, n)                                                   \
  for (int vari = 0; vari < (n)-1; ++vari)                                     \
    for (int varj = vari + 1; varj < (n); ++varj)
#define ALL(c) (c).begin(), (c).end()
#define RALL(c) (c).rbegin(), (c).rend()
#define tr(i, c) for (auto i = (c).begin(); i != (c).end(); ++i)
#define found(s, e) ((s).find(e) != (s).end())
#define mset(arr, val) memset(arr, val, sizeof(arr))
#define mid(x, y) ((x) + ((y) - (x)) / 2)
#define IN(x, a, b) ((a) <= (x) && (x) <= (b))
#define cons make_pair

ll gcd(ll a, ll b) {
  while (a)
    swap(a, b %= a);
  return b;
}

const ll MOD = 1000000007LL;

ll ADD(ll x, ll y) { return (x + y) % MOD; }
ll SUB(ll x, ll y) { return (x - y + MOD) % MOD; }
ll MUL(ll x, ll y) { return x * y % MOD; }
ll POW(ll x, ll e) {
  ll v = 1;
  for (; e; x = MUL(x, x), e >>= 1)
    if (e & 1)
      v = MUL(v, x);
  return v;
}
ll DIV(ll x, ll y) { /*assert(y%MOD!=0);*/
  return MUL(x, POW(y, MOD - 2));
}
// ll comb(ll n, ll k) { ll v=1; for(ll i=1; i<=k; i++) v = DIV(MUL(v,
// n-i+1),i); return v; }
//

#define INTSPACE 12
char _buf[INTSPACE * 1000000 + 3];

int loadint() {
  if (fgets(_buf, INTSPACE + 3, stdin) == NULL)
    return 0;
  return atoi(_buf);
}

int loadvec(vector<int> &v, int N = -1) {
  if (N == -1) {
    N = loadint();
    if (N == 0)
      return 0;
  }
  int bufsize = INTSPACE * N + 3;
  if (fgets(_buf, bufsize, stdin) == NULL)
    return 0;
  v.resize(N);

  int i = 0;
  bool last = false;
  for (char *p = &_buf[0];;) {
    char *q = p;
    while (*q > ' ')
      ++q;
    if (*q == 0x0D || *q == 0x0A)
      last = true;
    *q = 0;
    v[i++] = atoi(p);
    if (last || i == N)
      break;
    p = q + 1;
  }
  // assert(i <= N);
  return i;
}
void read_cr() { fgets(_buf, 256, stdin); }

int N, L, Q;
vi x;

vvi reach;
int R;

void prepare() {
  R = 0;
  for (int x = N; x > 0; x /= 2)
    ++R;
  reach.resize(R);

#ifdef DEBUG
  cerr << "prep. N=" << N << x << " L=" << L << ", R=" << R << endl;
#endif

  reach[0].resize(N);
  rep(i, N) {
    auto it = lower_bound(ALL(x), x[i] + L + 1);
    reach[0][i] = (int)(it - x.begin() - 1);
  }
#ifdef DEBUG
  cerr << "1:" << reach[0] << endl;
#endif
  for (int l = 1, d = 2; d <= N; ++l, d *= 2) {
    reach[l].resize(N);
    rep(i, N) {
      int hop = reach[l - 1][i];
      if (hop == N) {
        reach[l][i] = N;
      } else {
        int step = reach[l - 1][hop];
        reach[l][i] = (step == hop) ? N : step;
      }
    }
#ifdef DEBUG
    cerr << d << ":" << reach[l] << endl;
#endif
  }
}

ii step(int from, int to) { // (moves, curr)
  assert(from <= to);
  if (from == to)
    return ii(0, to);

#ifdef DEBUG
  fprintf(stderr, "step(%d %d):", from, to);
#endif

  int moves = 0, curr = from;

  rep(l, R) {
    int r = reach[l][from];

#ifdef DEBUG
    fprintf(stderr, "  l=%d, r=%d\n", l, r);
#endif
    if (to < r) { // over
      break;
    }

    moves = 1 << l;
    curr = reach[l][from];
    // if (to == r) break;
  }
  return ii(moves, curr);
}
int query(int a, int b) {
  assert(IN(a, 1, N) && IN(b, 1, N) && a != b);
  --a;
  --b;
  if (a > b)
    swap(a, b);
  assert(a < b);
#ifdef DEBUG
  fprintf(stderr, "query(%d %d)..\n", a, b);
#endif

  int moves = 0;
  for (int curr = a; curr < b;) {
    ii m = step(curr, b);
#ifdef DEBUG
    fprintf(stderr, " => (moves=%d, curr=%d)\n", m.first, m.second);
#endif
    if (m.first == 0) {
      ++moves;
      break;
    }

    moves += m.first;
    curr = m.second;
  }
#ifdef DEBUG
  cerr << "moves=" << moves << endl;
#endif
  return moves;
}

int main() {
  N = loadvec(x);
  cin >> L;
  prepare();

  cin >> Q;
  rep(q, Q) {
    int a, b;
    cin >> a >> b;
    cout << query(a, b) << endl;
  }
  return 0;
}