#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline T rd() {
  T nmb = 0;
  int sgn = 0;
  char chr = getchar();
  while (!isdigit(chr)) {
    if (chr == '-') sgn = 1;
    chr = getchar();
  }
  while (isdigit(chr)) {
    nmb = (nmb << 3) + (nmb << 1) + chr - '0';
    chr = getchar();
  }
  return sgn ? -nmb : nmb;
}
template <typename T>
void wt(T nmb) {
  if (nmb > 9) wt(nmb / 10);
  putchar(nmb % 10 + '0');
}
template <typename T>
inline void cmax(T &x, T y) {
  x = x > y ? x : y;
}
template <typename T>
inline void cmin(T &x, T y) {
  x = x < y ? x : y;
}
inline void proc_status() {
  ifstream t("/proc/self/status");
  cerr << string(istreambuf_iterator<char>(t), istreambuf_iterator<char>())
       << endl;
}
const int N = 2e5 + 10, L = 20;
int a[N];
vector<pair<int, int> > vec[L];
int f[N << 2], g[N << 2];
int ans[N], b[N];
int main() {
  int n = rd<int>(), p = rd<int>();
  for (int i = 1; i <= n; ++i) a[i] = rd<int>();
  int lev = 1;
  int Flg = 0;
  for (int k = p; !Flg; k >>= 1, ++lev) {
    if (!k) Flg = 1;
    for (int l = 1, r = 1; l <= n; l = r + 1) {
      r = l;
      while (r < n && a[r + 1] - a[r] <= k) ++r;
      vec[lev].push_back(make_pair(l, r));
    }
  }
  lev -= 2;
  int k = (1 << lev) - 1;
  for (int S = 0; S <= k; ++S) f[S] = 0, g[S] = n + 1;
  for (int S = 0; S <= k; ++S) {
    for (int T = S; T; T ^= (T & (-T))) {
      int t = (int)log2((T & (-T))) + 2;
      int U = S ^ (T & (-T));
      int pos = upper_bound(vec[t].begin(), vec[t].end(),
                            make_pair(f[U] + 1, n + 1)) -
                vec[t].begin() - 1;
      if (pos >= 0) cmax(f[S], vec[t][pos].second);
      pos = upper_bound(vec[t].begin(), vec[t].end(),
                        make_pair(g[U] - 1, n + 1)) -
            vec[t].begin() - 1;
      if (pos >= 0 && vec[t][pos].second >= g[U] - 1)
        cmin(g[S], vec[t][pos].first);
    }
  }
  for (int S = 0; S <= k; ++S) {
    int l = f[S], r = g[k ^ S];
    int pos1 =
        upper_bound(vec[1].begin(), vec[1].end(), make_pair(l + 1, n + 1)) -
        vec[1].begin() - 1;
    int pos2 =
        upper_bound(vec[1].begin(), vec[1].end(), make_pair(r - 1, n + 1)) -
        vec[1].begin() - 1;
    if (vec[1][pos2].second < r - 1) ++pos2;
    if (pos1 >= 0 && pos2 >= 0 && pos1 == pos2) b[pos1] = 1;
  }
  for (int i = 0; i < (int)vec[1].size(); ++i)
    for (int t = vec[1][i].first; t <= vec[1][i].second; ++t) ans[t] = b[i];
  for (int i = 1; i <= n; ++i)
    if (ans[i])
      puts("Possible");
    else
      puts("Impossible");
  return 0;
}
