Problem p03771 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
typedef long long ll;
ll gi() {
  ll x = 0, f = 1;
  char ch = getchar();
  while (!isdigit(ch))
    f ^= ch == '-', ch = getchar();
  while (isdigit(ch))
    x = x * 10 + ch - '0', ch = getchar();
  return f ? x : -x;
}
int x[200010], dv[200010], m, L[200010], R[200010], c[200010];
std::vector<int> P[200010];
int fl[200010], fr[200010];
int main() {
#ifdef XZZSB
  freopen("in.in", "r", stdin);
  freopen("out.out", "w", stdout);
#endif
  int n = gi(), V = gi();
  for (int i = 1; i <= n; ++i)
    x[i] = gi();
  for (int i = V, j = 0; ~i; i >>= 1, ++j) {
    dv[j] = i;
    P[m = j].push_back(0);
    for (int l = 1, r; l <= n; l = r + 1) {
      r = l;
      while (r < n && x[r + 1] - x[r] <= i)
        ++r;
      P[j].push_back(r);
      if (!j)
        for (int o = l; o <= r; ++o)
          L[o] = l, R[o] = r;
    }
    if (!i)
      break;
  }
  for (int i = 0; i < 1 << m; ++i) {
    for (int j = 1; j <= m; ++j) {
      if ((i >> j - 1) & 1)
        continue;
      int p;
      if (fl[i] == n)
        p = n;
      else
        p = *std::upper_bound(P[j].begin(), P[j].end(), fl[i]);
      fl[i | (1 << j - 1)] = std::max(fl[i | (1 << j - 1)], p);
    }
  }
  for (int i = 0; i < 1 << m; ++i)
    fr[i] = n + 1;
  for (int i = 0; i < 1 << m; ++i) {
    for (int j = 1; j <= m; ++j) {
      if ((i >> j - 1) & 1)
        continue;
      int p;
      if (fr[i] == 1)
        p = 1;
      else
        p = *--std::lower_bound(P[j].begin(), P[j].end(), fr[i] - 1) + 1;
      fr[i | (1 << j - 1)] = std::min(fr[i | (1 << j - 1)], p);
    }
  }
  for (int i = 0; i < 1 << m; ++i) {
    int l = fl[i] + 1, r = fr[((1 << m) - 1) ^ i] - 1;
    if (l > r)
      ++c[1];
    else if (*std::lower_bound(P[0].begin(), P[0].end(), l) >= r)
      ++c[l], --c[r + 1];
  }
  for (int i = 1; i <= n; ++i)
    c[i] += c[i - 1];
  for (int i = 1; i <= n; ++i)
    puts(c[i] ? "Possible" : "Impossible");
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
typedef long long ll;
ll gi() {
  ll x = 0, f = 1;
  char ch = getchar();
  while (!isdigit(ch))
    f ^= ch == '-', ch = getchar();
  while (isdigit(ch))
    x = x * 10 + ch - '0', ch = getchar();
  return f ? x : -x;
}
int x[200010], dv[200010], m, L[200010], R[200010], c[200010];
std::vector<int> P[200010];
int fl[262147], fr[262147];
int main() {
#ifdef XZZSB
  freopen("in.in", "r", stdin);
  freopen("out.out", "w", stdout);
#endif
  int n = gi(), V = gi();
  for (int i = 1; i <= n; ++i)
    x[i] = gi();
  for (int i = V, j = 0; ~i; i >>= 1, ++j) {
    dv[j] = i;
    P[m = j].push_back(0);
    for (int l = 1, r; l <= n; l = r + 1) {
      r = l;
      while (r < n && x[r + 1] - x[r] <= i)
        ++r;
      P[j].push_back(r);
      if (!j)
        for (int o = l; o <= r; ++o)
          L[o] = l, R[o] = r;
    }
    if (!i)
      break;
  }
  for (int i = 0; i < 1 << m; ++i) {
    for (int j = 1; j <= m; ++j) {
      if ((i >> j - 1) & 1)
        continue;
      int p;
      if (fl[i] == n)
        p = n;
      else
        p = *std::upper_bound(P[j].begin(), P[j].end(), fl[i]);
      fl[i | (1 << j - 1)] = std::max(fl[i | (1 << j - 1)], p);
    }
  }
  for (int i = 0; i < 1 << m; ++i)
    fr[i] = n + 1;
  for (int i = 0; i < 1 << m; ++i) {
    for (int j = 1; j <= m; ++j) {
      if ((i >> j - 1) & 1)
        continue;
      int p;
      if (fr[i] == 1)
        p = 1;
      else
        p = *--std::lower_bound(P[j].begin(), P[j].end(), fr[i] - 1) + 1;
      fr[i | (1 << j - 1)] = std::min(fr[i | (1 << j - 1)], p);
    }
  }
  for (int i = 0; i < 1 << m; ++i) {
    int l = fl[i] + 1, r = fr[((1 << m) - 1) ^ i] - 1;
    if (l > r)
      ++c[1];
    else if (*std::lower_bound(P[0].begin(), P[0].end(), l) >= r)
      ++c[l], --c[r + 1];
  }
  for (int i = 1; i <= n; ++i)
    c[i] += c[i - 1];
  for (int i = 1; i <= n; ++i)
    puts(c[i] ? "Possible" : "Impossible");
  return 0;
}