#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline int Chkmax(T &a, T b) {
  return a < b ? a = b, 1 : 0;
}
template <typename T>
inline int Chkmin(T &a, T b) {
  return a > b ? a = b, 1 : 0;
}
template <typename T>
inline T read() {
  T sum = 0, fl = 1;
  char ch = getchar();
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-') fl = -1;
  for (; isdigit(ch); ch = getchar()) sum = (sum << 3) + (sum << 1) + ch - '0';
  return sum * fl;
}
inline void proc_status() {
  ifstream t("/proc/self/status");
  cerr << string(istreambuf_iterator<char>(t), istreambuf_iterator<char>())
       << endl;
}
const int Maxn = 2e5 + 100;
const int Maxm = 20 + 5;
const int Maxs = (1 << 20) + 100;
int N, V, Log;
int A[Maxn];
int L[Maxm][Maxn], R[Maxm][Maxn];
int Next[Maxn];
inline void get_seg() {
  for (int i = 0; i <= Log; ++i) {
    int v = V >> i;
    for (int j = N; j >= 1; --j) {
      int p = upper_bound(A + 1, A + N + 1, A[j] + v) - A - 1;
      Next[j] = 0;
      Next[j] = max(Next[p], j);
    }
    for (int l = 1, r = 0; l <= N; l = r + 1) {
      r = Next[l];
      L[i][++L[i][0]] = l, R[i][++R[i][0]] = r;
    }
  }
}
int f[Maxs], g[Maxs];
inline void get_f() {
  int ALL = (1 << Log) - 1;
  f[0] = 1;
  for (int i = 0; i <= ALL; ++i) {
    if (!f[i]) continue;
    int preR = f[i];
    for (int j = 1; j <= Log; ++j) {
      if (i & (1 << (j - 1))) continue;
      int first =
          upper_bound(L[j] + 1, L[j] + L[j][0] + 1, preR + 1) - L[j] - 1;
      int nowR = max(preR, R[j][first]);
      Chkmax(f[i | (1 << (j - 1))], nowR);
    }
  }
}
inline void get_g() {
  int ALL = (1 << Log) - 1;
  for (int i = 0; i <= ALL; ++i) g[i] = N + 1;
  g[0] = N;
  for (int i = 0; i <= ALL; ++i) {
    if (g[i] == N + 1) continue;
    int preL = g[i];
    for (int j = 1; j <= Log; ++j) {
      if (i & (1 << (j - 1))) continue;
      int first = lower_bound(R[j] + 1, R[j] + R[j][0] + 1, preL - 1) - R[j];
      int nowL = min(preL, L[j][first]);
      Chkmin(g[i | (1 << (j - 1))], nowL);
    }
  }
}
inline void Solve() {
  get_seg();
  get_f();
  get_g();
  if (L[0][0] > Log + 3) {
    for (int i = 1; i <= N; ++i) puts("Impossible");
    return;
  }
  int ALL = (1 << Log) - 1;
  for (int i = 1; i <= L[0][0]; ++i) {
    int l = L[0][i], r = R[0][i], fl = 0;
    for (int j = 0; j <= ALL; ++j)
      if (l - 1 <= f[j] && g[ALL ^ j] <= r + 1) {
        fl = 1;
        break;
      }
    if (fl)
      for (int j = l; j <= r; ++j) puts("Possible");
    else
      for (int j = l; j <= r; ++j) puts("Impossible");
  }
}
inline void Input() {
  N = read<int>(), V = read<int>(), Log = log2(V + 1);
  for (int i = 1; i <= N; ++i) A[i] = read<int>();
}
int main() {
  Input();
  Solve();
  return 0;
}
