Problem p03771 (C++)

Buggy submission (status: Runtime Error):
#include <cstdio>
#include <iostream>
#define MN 201000

int n, v;
int a[MN];
int f[MN], g[MN];
int b[MN];
int nxt[20][MN];
int lst[20][MN];

int main() {
  scanf("%d%d", &n, &v);
  for (int i = 1; i <= n; i++)
    scanf("%d", &a[i]);
  int x = v;
  int m = 0;
  while (x) {
    b[m++] = x / 2;
    x /= 2;
  }
  b[m] = v;

  for (int i = 0; i <= m; i++) {
    lst[i][1] = 1;
    for (int j = 2; j <= n; j++) {
      if (a[j] - a[j - 1] <= b[i])
        lst[i][j] = lst[i][j - 1];
      else
        lst[i][j] = j;
    }
  }

  int tot = 0;
  for (int i = 0; i <= m; i++) {
    nxt[i][n] = n;
    for (int j = n - 1; j >= 1; j--) {
      if (a[j + 1] - a[j] <= b[i])
        nxt[i][j] = nxt[i][j + 1];
      else {
        nxt[i][j] = j;
        if (i == m)
          tot++;
      }
    }
  }

  if (m < tot) {
    for (int i = 1; i <= n; i++)
      puts("Impossible");
    return 0;
  }

  for (int S = 0; S < (1 << m); S++)
    g[S] = n + 1;
  for (int S = 0; S < (1 << m); S++) {
    for (int i = 0; i < m; i++) {
      if (!((S >> i) & 1)) {
        f[S | (1 << i)] = std::max(f[S | (1 << i)], nxt[i][f[S] + 1]);
        g[S | (1 << i)] = std::min(g[S | (1 << i)], lst[i][g[S] - 1]);
      }
    }
  }

  for (int i = 1; i <= n; i++) {
    bool ok = 0;
    for (int S = 0; S < (1 << m); S++) {
      int T = ((1 << m) - 1) ^ S;
      if (f[S] >= i - 1 && g[T] <= nxt[m][i] + 1) {
        ok = 1;
        break;
      }
    }
    for (int j = i; j <= nxt[m][i]; j++) {
      if (ok)
        puts("Possible");
      else
        puts("Impossible");
    }
    i = nxt[m][i];
  }
}

Fixed submission:
#include <cstdio>
#include <iostream>
#define MN 266666

int n, v;
int a[MN];
int f[MN], g[MN];
int b[MN];
int nxt[20][MN];
int lst[20][MN];

int main() {
  scanf("%d%d", &n, &v);
  for (int i = 1; i <= n; i++)
    scanf("%d", &a[i]);
  int x = v;
  int m = 0;
  while (x) {
    b[m++] = x / 2;
    x /= 2;
  }
  b[m] = v;

  for (int i = 0; i <= m; i++) {
    lst[i][1] = 1;
    for (int j = 2; j <= n; j++) {
      if (a[j] - a[j - 1] <= b[i])
        lst[i][j] = lst[i][j - 1];
      else
        lst[i][j] = j;
    }
  }

  int tot = 0;
  for (int i = 0; i <= m; i++) {
    nxt[i][n] = n;
    for (int j = n - 1; j >= 1; j--) {
      if (a[j + 1] - a[j] <= b[i])
        nxt[i][j] = nxt[i][j + 1];
      else {
        nxt[i][j] = j;
        if (i == m)
          tot++;
      }
    }
  }

  if (m < tot) {
    for (int i = 1; i <= n; i++)
      puts("Impossible");
    return 0;
  }

  for (int S = 0; S < (1 << m); S++)
    g[S] = n + 1;
  for (int S = 0; S < (1 << m); S++) {
    for (int i = 0; i < m; i++) {
      if (!((S >> i) & 1)) {
        f[S | (1 << i)] = std::max(f[S | (1 << i)], nxt[i][f[S] + 1]);
        g[S | (1 << i)] = std::min(g[S | (1 << i)], lst[i][g[S] - 1]);
      }
    }
  }

  for (int i = 1; i <= n; i++) {
    bool ok = 0;
    for (int S = 0; S < (1 << m); S++) {
      int T = ((1 << m) - 1) ^ S;
      if (f[S] >= i - 1 && g[T] <= nxt[m][i] + 1) {
        ok = 1;
        break;
      }
    }
    for (int j = i; j <= nxt[m][i]; j++) {
      if (ok)
        puts("Possible");
      else
        puts("Impossible");
    }
    i = nxt[m][i];
  }
}