Problem p03771 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>
#define inf 12345678
using namespace std;
inline int read() {
  int x = 0, f = 0;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-')
      f = 1;
    c = getchar();
  }
  while (c >= '0' && c <= '9')
    x = x * 10 + c - '0', c = getchar();
  if (f)
    x = -x;
  return x;
}
inline int max(int a, int b) { return a > b ? a : b; }
inline int min(int a, int b) { return a < b ? a : b; }
int l[21][200005], r[21][200005];
int a[200005], n, v, p[21], cnt = 0;
int fl[262145], fr[262145], tot[21];
inline int calc(int pos) {
  int lp = l[cnt + 1][pos] - 1, rp = r[cnt + 1][pos] + 1;
  for (int i = 0; i < (1 << cnt); i++) {
    if (fl[i] >= lp && fr[(1 << cnt) - 1 - i] <= rp)
      return 1;
  }
  return 0;
}
int main() {
  freopen("ernd.in", "r", stdin);
  freopen("ernd.out", "w", stdout);
  int i, j;
  n = read();
  v = read();
  for (i = 1; i <= n; i++) {
    a[i] = read();
  }
  while (v) {
    p[++cnt] = v;
    v >>= 1;
  }
  p[++cnt] = 0;
  reverse(p + 1, p + cnt + 1);
  for (j = 1; j <= cnt; j++) {
    int pos = 1;
    while (pos <= n) {
      int sta = pos;
      while (pos <= n && a[pos + 1] - a[pos] <= p[j])
        pos++;
      for (i = sta; i <= pos; i++) {
        l[j][i] = sta;
        r[j][i] = pos;
      }
      pos++;
      tot[j]++;
    }
    l[j][n + 1] = n + 1;
    r[j][n + 1] = n + 1;
    l[j][0] = 0;
    r[j][0] = 0;
  }
  if (tot[cnt] > cnt) {
    for (i = 1; i <= n; i++) {
      puts("Impossible");
    }
    return 0;
  }
  cnt--;
  for (i = 0; i < (1 << cnt); i++) {
    fl[i] = 0;
    fr[i] = n + 1;
    for (j = 1; j <= cnt; j++) {
      if (!((1 << (j - 1)) & i))
        continue;
      fl[i] = max(fl[i], r[j][fl[(i ^ (1 << (j - 1)))] + 1]);
      fr[i] = min(fr[i], l[j][fr[(i ^ (1 << (j - 1)))] - 1]);
    }
  }
  int las;
  for (i = 1; i <= n; i++) {
    if (l[cnt + 1][i] == i)
      las = calc(i);
    puts(las ? "Possible" : "Impossible");
  }
  return 0;
}

Fixed submission:
#include <bits/stdc++.h>
#define inf 12345678
using namespace std;
inline int read() {
  int x = 0, f = 0;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-')
      f = 1;
    c = getchar();
  }
  while (c >= '0' && c <= '9')
    x = x * 10 + c - '0', c = getchar();
  if (f)
    x = -x;
  return x;
}
inline int max(int a, int b) { return a > b ? a : b; }
inline int min(int a, int b) { return a < b ? a : b; }
int l[21][200005], r[21][200005];
int a[200005], n, v, p[21], cnt = 0;
int fl[262145], fr[262145], tot[21];
inline int calc(int pos) {
  int lp = l[cnt + 1][pos] - 1, rp = r[cnt + 1][pos] + 1;
  for (int i = 0; i < (1 << cnt); i++) {
    if (fl[i] >= lp && fr[(1 << cnt) - 1 - i] <= rp)
      return 1;
  }
  return 0;
}
int main() {
  int i, j;
  n = read();
  v = read();
  for (i = 1; i <= n; i++) {
    a[i] = read();
  }
  while (v) {
    p[++cnt] = v;
    v >>= 1;
  }
  p[++cnt] = 0;
  reverse(p + 1, p + cnt + 1);
  for (j = 1; j <= cnt; j++) {
    int pos = 1;
    while (pos <= n) {
      int sta = pos;
      while (pos <= n && a[pos + 1] - a[pos] <= p[j])
        pos++;
      for (i = sta; i <= pos; i++) {
        l[j][i] = sta;
        r[j][i] = pos;
      }
      pos++;
      tot[j]++;
    }
    l[j][n + 1] = n + 1;
    r[j][n + 1] = n + 1;
    l[j][0] = 0;
    r[j][0] = 0;
  }
  if (tot[cnt] > cnt) {
    for (i = 1; i <= n; i++) {
      puts("Impossible");
    }
    return 0;
  }
  cnt--;
  for (i = 0; i < (1 << cnt); i++) {
    fl[i] = 0;
    fr[i] = n + 1;
    for (j = 1; j <= cnt; j++) {
      if (!((1 << (j - 1)) & i))
        continue;
      fl[i] = max(fl[i], r[j][fl[(i ^ (1 << (j - 1)))] + 1]);
      fr[i] = min(fr[i], l[j][fr[(i ^ (1 << (j - 1)))] - 1]);
    }
  }
  int las;
  for (i = 1; i <= n; i++) {
    if (l[cnt + 1][i] == i)
      las = calc(i);
    puts(las ? "Possible" : "Impossible");
  }
  return 0;
}