Problem p03771 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <cstdio>
#include <vector>
using namespace std;
const int N = 200200, D = 18;
int i, j, k, n, m, nm, mm, ch, ff;
int x[N], pre[1 << D], suf[1 << D], ans[N];
vector<int> X[D];
void R(int &x) {
  ff = x = 0;
  ch = getchar();
  while (ch < '0' || '9' < ch) {
    if (ch == '-')
      ff = 1;
    ch = getchar();
  }
  while ('0' <= ch && ch <= '9')
    x = x * 10 + ch - '0', ch = getchar();
  if (ff)
    x = -x;
}
int find1(int i, int x) {
  int l = 0, r = X[i].size() - 1, mid;
  while (l < r) {
    mid = (l + r + 1) >> 1;
    if (X[i][mid] > x)
      r = mid - 1;
    else
      l = mid;
  }
  return l;
}
int find2(int i, int x) {
  int l = 0, r = X[i].size() - 1, mid;
  while (l < r) {
    mid = (l + r - 1) >> 1;
    if (X[i][mid] < x)
      l = mid + 1;
    else
      r = mid;
  }
  return l;
}
void Max(int &x, int y) {
  if (y > x)
    x = y;
}
void Min(int &x, int y) {
  if (y < x)
    x = y;
}
int main() {
  R(n);
  R(m);
  for (i = 1; i <= n; i++)
    R(x[i]);
  k = m;
  while (1) {
    X[nm].push_back(1);
    for (i = 1; i < n; i++)
      if (x[i] + k < x[i + 1])
        X[nm].push_back(i + 1);
    X[nm].push_back(n + 1);
    nm++;
    if (!k)
      break;
    k >>= 1;
  }
  mm = 1 << nm;
  for (i = 0; i < mm; i++)
    suf[i] = n + 1;
  for (i = 0; i < mm; i += 2)
    for (j = 1; j < nm; j++)
      if (!(i & 1 << j)) {
        Max(pre[i | 1 << j], X[j][find1(j, pre[i] + 1) + 1] - 1);
        Min(suf[i | 1 << j], X[j][find2(j, suf[i]) - 1]);
      }
  if (X[0].size() > mm + 1) {
    for (i = 0; i < n; i++)
      puts("Impossible");
    return 0;
  }
  for (i = 1; i < X[0].size(); i++) {
    int l = X[0][i - 1], r = X[0][i] - 1, fg = 0;
    for (j = 0; j < mm; j += 2)
      if (pre[j] + 1 >= l && suf[(mm - 2) ^ j] - 1 <= r) {
        fg = 1;
        break;
      }
    for (j = l; j <= r; j++)
      ans[j] = fg;
  }
  for (i = 1; i <= n; i++) {
    if (ans[i])
      puts("Possible");
    else
      puts("Impossible");
  }
}

Fixed submission:
#include <algorithm>
#include <cstdio>
#include <vector>
using namespace std;
const int N = 200200, D = 20;
int i, j, k, n, m, nm, mm, ch, ff;
int x[N], pre[1 << D], suf[1 << D], ans[N];
vector<int> X[D];
void R(int &x) {
  ff = x = 0;
  ch = getchar();
  while (ch < '0' || '9' < ch) {
    if (ch == '-')
      ff = 1;
    ch = getchar();
  }
  while ('0' <= ch && ch <= '9')
    x = x * 10 + ch - '0', ch = getchar();
  if (ff)
    x = -x;
}
int find1(int i, int x) {
  int l = 0, r = X[i].size() - 1, mid;
  while (l < r) {
    mid = (l + r + 1) >> 1;
    if (X[i][mid] > x)
      r = mid - 1;
    else
      l = mid;
  }
  return l;
}
int find2(int i, int x) {
  int l = 0, r = X[i].size() - 1, mid;
  while (l < r) {
    mid = (l + r - 1) >> 1;
    if (X[i][mid] < x)
      l = mid + 1;
    else
      r = mid;
  }
  return l;
}
void Max(int &x, int y) {
  if (y > x)
    x = y;
}
void Min(int &x, int y) {
  if (y < x)
    x = y;
}
int main() {
  R(n);
  R(m);
  for (i = 1; i <= n; i++)
    R(x[i]);
  k = m;
  while (1) {
    X[nm].push_back(1);
    for (i = 1; i < n; i++)
      if (x[i] + k < x[i + 1])
        X[nm].push_back(i + 1);
    X[nm].push_back(n + 1);
    nm++;
    if (!k)
      break;
    k >>= 1;
  }
  mm = 1 << nm;
  for (i = 0; i < mm; i++)
    suf[i] = n + 1;
  for (i = 0; i < mm; i += 2)
    for (j = 1; j < nm; j++)
      if (!(i & 1 << j)) {
        Max(pre[i | 1 << j], X[j][find1(j, pre[i] + 1) + 1] - 1);
        Min(suf[i | 1 << j], X[j][find2(j, suf[i]) - 1]);
      }
  if (X[0].size() > mm + 1) {
    for (i = 0; i < n; i++)
      puts("Impossible");
    return 0;
  }
  for (i = 1; i < X[0].size(); i++) {
    int l = X[0][i - 1], r = X[0][i] - 1, fg = 0;
    for (j = 0; j < mm; j += 2)
      if (pre[j] + 1 >= l && suf[(mm - 2) ^ j] - 1 <= r) {
        fg = 1;
        break;
      }
    for (j = l; j <= r; j++)
      ans[j] = fg;
  }
  for (i = 1; i <= n; i++) {
    if (ans[i])
      puts("Possible");
    else
      puts("Impossible");
  }
}