#include <bits/stdc++.h>
using namespace std;
const int N = 262444, M = 22, mod = 1e9 + 7;
template <class T>
inline void gmin(T &x, const T &y) {
  if (x > y) x = y;
}
template <class T>
inline void gmax(T &x, const T &y) {
  if (x < y) x = y;
}
inline void ch(int &x, int y) { x = (x + y) % mod; }
template <class T>
inline void read(T &x) {
  x = 0;
  char ch = getchar(), rev = 0;
  while (ch > '9' || ch < '0') rev = (ch == '-'), ch = getchar();
  while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
  x = rev ? -x : x;
}
template <class T>
inline void print(T x) {
  if (!x) {
    puts("0");
    return;
  }
  if (x < 0) {
    putchar('-');
    x = -x;
  }
  int a[20], m = 0;
  while (x) a[m++] = x % 10, x /= 10;
  while (m--) putchar(a[m] + '0');
  puts("");
}
inline int exp(int x, int y) {
  int ans = 1;
  while (y) {
    if (y & 1) ans = (long long)ans * x % mod;
    x = (long long)x * x % mod;
    y >>= 1;
  }
  return ans;
}
int n, m, a[N], v[20], cnt[20], L[20][N], R[20][N], bel[N], si[N], ans[N];
map<pair<int, int>, bool> dp[20][N];
void dfs(int x, int l, int r) {
  if (x == m) return;
  for (int i = l; i <= r; i++) {
    int t = i;
    while (t < r && a[t + 1] - a[t] <= v[x]) t++;
    L[x][++cnt[x]] = cnt[x + 1] + 1;
    dfs(x + 1, i, t);
    R[x][cnt[x]] = cnt[x + 1];
    if (!x) {
      for (int j = i; j <= t; j++) bel[j] = cnt[x];
    }
    i = t;
  }
}
bool get(int x, int l, int r, int st) {
  if (l > r) return 1;
  if (si[st] <= r - l || x == m) return 0;
  if (!(st & (1 << x))) return get(x + 1, l, r, st);
  if (dp[x][st].count(make_pair(l, r))) return dp[x][st][make_pair(l, r)];
  bool ans = 0;
  for (int i = l; i <= r; i++) {
    int u = st ^ (1 << x);
    for (int j = u; j; j = (j - 1) & u)
      if (get(x + 1, L[x][l], R[x][i - 1], j) &&
          get(x + 1, L[x][i + 1], R[x][r], u ^ j)) {
        ans = 1;
        break;
      }
    if (get(x + 1, L[x][l], R[x][i - 1], 0) &&
        get(x + 1, L[x][i + 1], R[x][r], u))
      ans = 1;
    if (ans) break;
  }
  dp[x][st][make_pair(l, r)] = ans;
  return ans;
}
int main() {
  ios::sync_with_stdio(0);
  read(n);
  read(v[0]);
  for (int i = 1; i <= n; i++) read(a[i]);
  for (int j = 1; v[j - 1]; j++, m = j) v[j] = v[j - 1] >> 1;
  dfs(0, 1, n);
  if (cnt[0] > m) {
    for (int i = 1; i <= n; i++) puts("Impossible");
    return 0;
  }
  for (int i = 0; i < m; i++)
    L[i][cnt[i] + 1] = R[i][cnt[i] + 1] = cnt[i + 1] + 1;
  for (int i = 1; i < (1 << m); i++) si[i] = si[i ^ (i & -i)] + 1;
  for (int i = 1; i <= cnt[0]; i++) {
    int u = (1 << m) - 2;
    for (int j = 0; j < (1 << m); j += 2)
      if (get(1, L[0][1], R[0][i - 1], j) &&
          get(1, L[0][i + 1], R[0][cnt[0]], u ^ j)) {
        ans[i] = 1;
        break;
      }
  }
  for (int i = 1; i <= n; i++)
    if (ans[bel[i]])
      puts("Possible");
    else
      puts("Impossible");
  return 0;
}
