Problem p03771 (C++)

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

const int RLEN = 1 << 18 | 1;
inline char nc() {
  static char ibuf[RLEN], *ib, *ob;
  (ib == ob) && (ob = (ib = ibuf) + fread(ibuf, 1, RLEN, stdin));
  return (ib == ob) ? -1 : *ib++;
}
inline int rd() {
  char ch = nc();
  int i = 0, f = 1;
  while (!isdigit(ch)) {
    if (ch == '-')
      f = -1;
    ch = nc();
  }
  while (isdigit(ch)) {
    i = (i << 1) + (i << 3) + ch - '0';
    ch = nc();
  }
  return i * f;
}

const int N = 1e5 + 50;
int n, v, lg, x[N];
int len[20], bin[20];
int mxr[1 << 20], mnl[1 << 20];

struct BIT_MAX {
  int bit[N];
  BIT_MAX() {
    for (int i = 0; i < N; i++)
      bit[i] = -1e9;
  }
  inline void inc(int p, int v) {
    for (int i = p; i <= n + 1; i += (i & (-i)))
      bit[i] = max(bit[i], v);
  }
  inline int ask(int p, int v = -1e9) {
    for (int i = p; i; i -= (i & (-i)))
      v = max(v, bit[i]);
    return v;
  }
  inline void init(int lim) {
    for (int l = 1, r; l <= n; l = r + 1) {
      r = l;
      while (r < n && x[r + 1] - x[r] <= lim)
        ++r;
      inc(l, r);
    }
  }
} bit_max[21];

struct BIT_MIN {
  int bit[N];
  BIT_MIN() {
    for (int i = 0; i < N; i++)
      bit[i] = 1e9;
  }
  inline void inc(int p, int v) {
    for (int i = p; i; i -= (i & (-i)))
      bit[i] = min(bit[i], v);
  }
  inline int ask(int p, int v = 1e9) {
    if (!p)
      ++p;
    for (int i = p; i <= n; i += (i & (-i)))
      v = min(v, bit[i]);
    return v;
  }
  inline void init(int lim) {
    for (int l = 1, r; l <= n; l = r + 1) {
      r = l;
      while (r < n && x[r + 1] - x[r] <= lim)
        ++r;
      inc(r, l);
    }
  }
} bit_min[20];

int ok[N];
int main() {
  n = rd(), v = rd();
  for (int i = 1; i <= n; i++)
    x[i] = rd();

  for (int t = v;; t /= 2) {
    len[lg++] = t;
    if (!t)
      break;
  }
  for (int i = 0; i < lg; i++) {
    bin[i] = 1 << i;
    bit_max[i].init(len[i]);
    bit_min[i].init(len[i]);
  }

  mxr[0] = 0;
  mnl[0] = n + 1;
  bin[lg] = 1 << lg;
  for (int s = 1; s < bin[lg]; ++s) {
    if (s & 1)
      continue;
    int mx = 0, mn = n + 1;
    for (int k = 0; k < lg; ++k)
      if (s & bin[k]) {
        mx = max(mx, bit_max[k].ask(mxr[s ^ bin[k]] + 1));
        mn = min(mn, bit_min[k].ask(mnl[s ^ bin[k]] - 1));
      }
    mxr[s] = mx;
    mnl[s] = mn;
  }

  for (int i = 0; i < bin[lg]; ++i) {
    if (!(i & 1)) {
      int s1 = i, s2 = (bin[lg] - 1) ^ 1 ^ i;
      bit_max[20].inc(mnl[s2], mxr[s1]);
    }
  }
  for (int l = 1, r; l <= n; l = r + 1) {
    r = l;
    while (r < n && x[r + 1] - x[r] <= v)
      ++r;
    if (bit_max[20].ask(r + 1) >= l - 1)
      for (int i = l; i <= r; i++)
        ok[i] = 1;
  }
  for (int i = 1; i <= n; i++)
    puts((ok[i]) ? "Possible" : "Impossible");
}

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

const int RLEN = 1 << 18 | 1;
inline char nc() {
  static char ibuf[RLEN], *ib, *ob;
  (ib == ob) && (ob = (ib = ibuf) + fread(ibuf, 1, RLEN, stdin));
  return (ib == ob) ? -1 : *ib++;
}
inline int rd() {
  char ch = nc();
  int i = 0, f = 1;
  while (!isdigit(ch)) {
    if (ch == '-')
      f = -1;
    ch = nc();
  }
  while (isdigit(ch)) {
    i = (i << 1) + (i << 3) + ch - '0';
    ch = nc();
  }
  return i * f;
}

const int N = 2e5 + 50;
int n, v, lg, x[N];
int len[20], bin[20];
int mxr[1 << 20], mnl[1 << 20];

struct BIT_MAX {
  int bit[N];
  BIT_MAX() {
    for (int i = 0; i < N; i++)
      bit[i] = -1e9;
  }
  inline void inc(int p, int v) {
    for (int i = p; i <= n + 1; i += (i & (-i)))
      bit[i] = max(bit[i], v);
  }
  inline int ask(int p, int v = -1e9) {
    for (int i = p; i; i -= (i & (-i)))
      v = max(v, bit[i]);
    return v;
  }
  inline void init(int lim) {
    for (int l = 1, r; l <= n; l = r + 1) {
      r = l;
      while (r < n && x[r + 1] - x[r] <= lim)
        ++r;
      inc(l, r);
    }
  }
} bit_max[21];

struct BIT_MIN {
  int bit[N];
  BIT_MIN() {
    for (int i = 0; i < N; i++)
      bit[i] = 1e9;
  }
  inline void inc(int p, int v) {
    for (int i = p; i; i -= (i & (-i)))
      bit[i] = min(bit[i], v);
  }
  inline int ask(int p, int v = 1e9) {
    if (!p)
      ++p;
    for (int i = p; i <= n; i += (i & (-i)))
      v = min(v, bit[i]);
    return v;
  }
  inline void init(int lim) {
    for (int l = 1, r; l <= n; l = r + 1) {
      r = l;
      while (r < n && x[r + 1] - x[r] <= lim)
        ++r;
      inc(r, l);
    }
  }
} bit_min[20];

int ok[N];
int main() {
  n = rd(), v = rd();
  for (int i = 1; i <= n; i++)
    x[i] = rd();

  for (int t = v;; t /= 2) {
    len[lg++] = t;
    if (!t)
      break;
  }
  for (int i = 0; i < lg; i++) {
    bin[i] = 1 << i;
    bit_max[i].init(len[i]);
    bit_min[i].init(len[i]);
  }

  mxr[0] = 0;
  mnl[0] = n + 1;
  bin[lg] = 1 << lg;
  for (int s = 1; s < bin[lg]; ++s) {
    if (s & 1)
      continue;
    int mx = 0, mn = n + 1;
    for (int k = 0; k < lg; ++k)
      if (s & bin[k]) {
        mx = max(mx, bit_max[k].ask(mxr[s ^ bin[k]] + 1));
        mn = min(mn, bit_min[k].ask(mnl[s ^ bin[k]] - 1));
      }
    mxr[s] = mx;
    mnl[s] = mn;
  }

  for (int i = 0; i < bin[lg]; ++i) {
    if (!(i & 1)) {
      int s1 = i, s2 = (bin[lg] - 1) ^ 1 ^ i;
      bit_max[20].inc(mnl[s2], mxr[s1]);
    }
  }
  for (int l = 1, r; l <= n; l = r + 1) {
    r = l;
    while (r < n && x[r + 1] - x[r] <= v)
      ++r;
    if (bit_max[20].ask(r + 1) >= l - 1)
      for (int i = l; i <= r; i++)
        ok[i] = 1;
  }
  for (int i = 1; i <= n; i++)
    puts((ok[i]) ? "Possible" : "Impossible");
}