Problem p03771 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#define MAX(x, y) x = max(x, y)
#define MIN(x, y) x = min(x, y)
#define inf 0x3f3f3f3f
using namespace std;

const int N = 200005;

int n, v, g[N * 2], f[N * 2], bin[25], tot, len[25], lef[25][N], rig[25][N],
    a[N], bel[N], p1[N], p2[N];
bool ans[N];

int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-')
      f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return x * f;
}

void dp() {
  bin[0] = 1;
  for (int i = 1; i <= tot; i++)
    bin[i] = bin[i - 1] * 2;
  for (int i = 0; i < bin[tot]; i++)
    g[i] = n + 1;
  for (int i = 0; i < bin[tot]; i++)
    for (int j = 0; j <= tot; j++)
      if (!(i & bin[j]))
        MAX(f[i + bin[j]], rig[j][f[i] + 1]),
            MIN(g[i + bin[j]], lef[j][g[i] - 1]);
  for (int i = 0; i < bin[tot]; i++) {
    int l = f[i], r = g[i ^ (bin[tot] - 1)];
    if (l + 1 >= r) {
      for (int j = 1; j <= n; j++)
        ans[j] = 1;
      return;
    }
    if (p1[bel[l + 1]] <= l + 1 && p2[bel[l + 1]] >= r - 1)
      ans[bel[l + 1]] = 1;
  }
}

int main() {
  n = read();
  v = read();
  for (int i = 1; i <= n; i++)
    a[i] = read();
  tot = 0;
  len[0] = 0;
  while (v)
    len[++tot] = v, v >>= 1;
  sort(len, len + tot + 1);
  memset(lef, inf, sizeof(lef));
  for (int i = 0; i < tot; i++)
    for (int j = 1; j <= n; j++) {
      int l = j;
      while (l < n && a[l + 1] - a[l] <= len[i])
        l++;
      rig[i][j] = l;
      lef[i][l] = j;
      j = l;
    }
  int id = 0;
  for (int j = 1; j <= n; j++) {
    int l = j;
    bel[j] = ++id;
    while (l < n && a[l + 1] - a[l] <= len[tot])
      l++, bel[l] = id;
    p1[id] = j;
    p2[id] = l;
    j = l;
  }
  dp();
  for (int i = 1; i <= n; i++)
    puts(ans[bel[i]] ? "Possible" : "Impossible");
  return 0;
}

Fixed submission:
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#define MAX(x, y) x = max(x, y)
#define MIN(x, y) x = min(x, y)
#define inf 0x3f3f3f3f
using namespace std;

const int N = 400005;

int n, v, g[N * 2], f[N * 2], bin[25], tot, len[25], lef[25][N], rig[25][N],
    a[N], bel[N], p1[N], p2[N];
bool ans[N];

int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-')
      f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return x * f;
}

void dp() {
  bin[0] = 1;
  for (int i = 1; i <= tot; i++)
    bin[i] = bin[i - 1] * 2;
  for (int i = 0; i < bin[tot]; i++)
    g[i] = n + 1;
  for (int i = 0; i < bin[tot]; i++)
    for (int j = 0; j <= tot; j++)
      if (!(i & bin[j]))
        MAX(f[i + bin[j]], rig[j][f[i] + 1]),
            MIN(g[i + bin[j]], lef[j][g[i] - 1]);
  for (int i = 0; i < bin[tot]; i++) {
    int l = f[i], r = g[i ^ (bin[tot] - 1)];
    if (l + 1 >= r) {
      for (int j = 1; j <= n; j++)
        ans[j] = 1;
      return;
    }
    if (p1[bel[l + 1]] <= l + 1 && p2[bel[l + 1]] >= r - 1)
      ans[bel[l + 1]] = 1;
  }
}

int main() {
  n = read();
  v = read();
  for (int i = 1; i <= n; i++)
    a[i] = read();
  tot = 0;
  len[0] = 0;
  while (v)
    len[++tot] = v, v >>= 1;
  sort(len, len + tot + 1);
  memset(lef, inf, sizeof(lef));
  for (int i = 0; i < tot; i++)
    for (int j = 1; j <= n; j++) {
      int l = j;
      while (l < n && a[l + 1] - a[l] <= len[i])
        l++;
      rig[i][j] = l;
      lef[i][l] = j;
      j = l;
    }
  int id = 0;
  for (int j = 1; j <= n; j++) {
    int l = j;
    bel[j] = ++id;
    while (l < n && a[l + 1] - a[l] <= len[tot])
      l++, bel[l] = id;
    p1[id] = j;
    p2[id] = l;
    j = l;
  }
  dp();
  for (int i = 1; i <= n; i++)
    puts(ans[bel[i]] ? "Possible" : "Impossible");
  return 0;
}