#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
const int N = (int)2e5 + 9;
const int K = 20;
int dpL[1 << K];
int dpR[1 << K];
int x[N];
int pl[K][N];
int pr[K][N];
int cnt[N];
void update(int cl, int cr) {
  cnt[cl]++;
  cnt[cr + 1]--;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  ;
  int n, k;
  cin >> n >> k;
  for (int i = 1; i <= n; i++) {
    cin >> x[i];
  }
  vector<int> vl;
  while (k > 0) {
    vl.push_back(k);
    k /= 2;
  }
  vl.push_back(0);
  reverse(vl.begin(), vl.end());
  int m = vl.size();
  int z = (1 << m);
  for (int i = 0; i < m; i++) {
    pl[i][1] = 1;
    for (int j = 2; j <= n; j++) {
      pl[i][j] = pl[i][j - 1];
      if (x[j] - x[j - 1] > vl[i]) {
        pl[i][j] = j;
      }
    }
    pr[i][n] = n;
    for (int j = n - 1; j >= 1; j--) {
      pr[i][j] = pr[i][j + 1];
      if (x[j + 1] - x[j] > vl[i]) {
        pr[i][j] = j;
      }
    }
  }
  for (int i = 0; i < z; i++) dpL[i] = 0, dpR[i] = n + 1;
  int mask;
  for (int i = 0; i < z; i++) {
    for (int j = 0; j < m; j++) {
      if (i & (1 << j)) continue;
      mask = i | (1 << j);
      if (dpL[i] == n)
        dpL[mask] = n;
      else
        dpL[mask] = max(dpL[mask], pr[j][dpL[i] + 1]);
    }
  }
  for (int i = 0; i < z; i++) {
    for (int j = 0; j < m; j++) {
      if (i & (1 << j)) continue;
      mask = i | (1 << j);
      if (dpR[i] == 1)
        dpR[mask] = 1;
      else
        dpR[mask] = min(dpR[mask], pl[j][dpR[i] - 1]);
    }
  }
  int oth;
  int L, R;
  for (int i = 0; i < (1 << (m - 1)); i++) {
    oth = (1 << (m - 1)) - i - 1;
    L = dpL[i];
    R = dpR[oth];
    if (L >= R) {
      update(1, n);
    } else {
      if (pr[m - 1][L + 1] >= R - 1) {
        update(L + 1, R - 1);
      }
    }
  }
  for (int i = 1; i <= n; i++) {
    cnt[i] += cnt[i - 1];
    if (cnt[i] > 0)
      cout << "Possible\n";
    else
      cout << "Impossible\n";
  }
  return 0;
}
