#include <bits/stdc++.h>
using namespace std;
class segtree {
 public:
  static const int N = 1 << 18;
  int dp[1 << 19];
  segtree() { memset(dp, 0, sizeof(dp)); }
  void init(int v) {
    for (int i = 0; i < N * 2; i++) {
      dp[i] = v;
    }
  }
  void update(int k, int v) {
    k += N - 1;
    dp[k] = min(v, dp[k]);
    while (k > 0) {
      k = (k - 1) / 2;
      dp[k] = min(dp[k * 2 + 1], dp[k * 2 + 2]);
    }
  }
  int query(int a, int b, int k = 0, int l = 0, int r = N) {
    if (b <= l || r <= a) return 1000000007;
    if (a <= l && r <= b) return dp[k];
    int mid = (l + r) / 2;
    int vl = query(a, b, k * 2 + 1, l, mid);
    int vr = query(a, b, k * 2 + 2, mid, r);
    return min(vl, vr);
  }
};
segtree seg;
int n;
long long v;
long long x[200005];
long long to[2][20][200005];
long long dp[2][1 << 20];
bool ans[200005];
int main(void) {
  scanf("%d%lld", &n, &v);
  seg.init(n + 1);
  for (int i = 0; i < n; i++) {
    scanf("%lld", &x[i]);
  }
  int jp = 0;
  long long tmp = v;
  while (v > 0) {
    jp++;
    v /= 2LL;
  }
  jp++;
  v = tmp;
  for (int ty = 0; ty < 2; ty++) {
    tmp = v;
    for (int i = 0; i < jp; i++) {
      int f = 0;
      for (int j = 1; j < n; j++) {
        if (x[j - 1] + v < x[j]) {
          for (int k = f; k < j; k++) {
            to[ty][i][k] = j;
          }
          f = j;
        }
      }
      for (int j = f; j < n; j++) {
        to[ty][i][j] = n;
      }
      to[ty][i][n] = n;
      v /= 2;
    }
    for (int i = 0; i < (1 << jp); i++) {
      for (int j = 0; j < jp; j++) {
        if (!(i >> j & 1)) {
          dp[ty][i | (1 << j)] =
              max(dp[ty][i | (1 << j)], to[ty][j][dp[ty][i]]);
        }
      }
    }
    v = tmp;
    reverse(x, x + n);
    for (int i = 0; i < n; i++) {
      x[i] = -x[i];
    }
  }
  for (int i = 0; i < jp; i++) {
    reverse(to[1][i], to[1][i] + n);
    for (int j = 0; j < n; j++) {
      to[1][i][j] = n - to[1][i][j];
    }
  }
  for (int i = 0; i < (1 << jp); i++) {
    dp[1][i] = n - dp[1][i];
  }
  for (int i = 0; i < (1 << jp); i++) {
    if (i >> 0 & 1) continue;
    seg.update(dp[0][i], dp[1][(1 << jp) - i - 2]);
  }
  for (int i = 0; i < n; i++) {
    if (to[0][0][i] == n - 1) {
      if (to[1][0][i] == 0) {
        ans[i] = true;
      } else {
        ans[i] = (seg.query(to[1][0][i], seg.N) <= n);
      }
    } else {
      if (to[1][0][i] == 0) {
        ans[i] = (seg.query(0, seg.N) <= to[0][0][i]);
      } else {
        ans[i] = (seg.query(to[1][0][i], seg.N) <= to[0][0][i]);
      }
    }
  }
  for (int i = 0; i < n; i++) {
    printf("%s\n", ans[i] ? "Possible" : "Impossible");
  }
  return 0;
}
