#include <bits/stdc++.h>
using namespace std;
const int N = (1 << 20) + 5;
int n, v, tot, sum, x[N], vn[N], nxt[25][N], f[N][25], l[N], r[N], bel[N],
    ok[N];
int imp() {
  for (int i = 1; i <= n + 1; i++) puts("Impossible");
  return 0;
}
void upd(int &x, int y) { x = max(x, y); }
int main() {
  scanf("%d%d", &n, &v);
  for (int i = 1; i <= n; i++) scanf("%d", x + i);
  --n;
  for (int i = 1; i <= n; i++) x[i] = x[i + 1] - x[i];
  while (v) {
    vn[++tot] = v;
    v >>= 1;
  }
  sort(vn + 1, vn + 1 + tot);
  for (int i = 1; i <= n; i++)
    x[i] = lower_bound(vn + 1, vn + tot + 1, x[i]) - vn;
  for (int i = 1; i <= tot; i++) {
    nxt[i][n + 1] = n + 1;
    for (int j = n; j >= 1; j--)
      if (x[j] <= i)
        nxt[i][j] = nxt[i][j + 1];
      else
        nxt[i][j] = j;
  }
  for (int i = 1; i <= n + 1; i++) nxt[0][i] = i;
  ++tot;
  int tmp = 0;
  while (tmp < n + 1) {
    ++sum;
    l[sum] = tmp + 1;
    tmp = nxt[tot - 1][tmp + 1];
    r[sum] = tmp;
    for (int i = l[sum]; i <= r[sum]; i++) bel[i] = sum;
  }
  if (sum > tot + 2) return imp();
  f[0][0] = 0;
  int mx = 1 << (tot - 1);
  for (int i = 0; i <= (1 << tot) - 1; i++)
    for (int j = 0; j <= sum; j++) {
      if (((i & mx) != 0) ^ (j != 0)) continue;
      int nw = f[i][j] + 1;
      if (nw > n) {
        ok[j] = 1;
        continue;
      }
      if (j == 0) upd(f[i | mx][bel[nw]], nxt[tot - 1][nw]);
      for (int k = 0; k <= tot - 2; k++)
        if ((i & 1 << k) == 0) upd(f[i | 1 << k][j], nxt[k][nw]);
    }
  for (int i = 1; i <= n + 1; i++) puts(ok[bel[i]] ? "Possible" : "Impossible");
  return 0;
}
