#include <bits/stdc++.h>
using namespace std;
const int iinf = 1e9 + 7;
const long long linf = 1ll << 60;
const double dinf = 1e60;
template <typename T>
inline void scf(T &x) {
  bool f = 0;
  x = 0;
  char c = getchar();
  while ((c < '0' || c > '9') && c != '-') c = getchar();
  if (c == '-') {
    f = 1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    x = x * 10 + c - '0';
    c = getchar();
  }
  if (f) x = -x;
  return;
}
template <typename T1, typename T2>
void scf(T1 &x, T2 &y) {
  scf(x);
  return scf(y);
}
template <typename T1, typename T2, typename T3>
void scf(T1 &x, T2 &y, T3 &z) {
  scf(x);
  scf(y);
  return scf(z);
}
template <typename T1, typename T2, typename T3, typename T4>
void scf(T1 &x, T2 &y, T3 &z, T4 &w) {
  scf(x);
  scf(y);
  scf(z);
  return scf(w);
}
inline char mygetchar() {
  char c = getchar();
  while (c == ' ' || c == '\n') c = getchar();
  return c;
}
template <typename T>
void chkmax(T &x, const T &y) {
  if (y > x) x = y;
  return;
}
template <typename T>
void chkmin(T &x, const T &y) {
  if (y < x) x = y;
  return;
}
void TZL();
void RANK1();
int main() {
  TZL();
  RANK1();
  return 0;
}
const int N = 2e5 + 100;
const int lgN = 20;
int n, V, m;
int x[N];
int lb[lgN][N], rb[lgN][N];
vector<pair<int, int> > seg[lgN];
int dpl[1048576], dpr[1048576];
void get_seg() {
  for (int i = 1, j; i <= n; i = j) {
    j = i + 1;
    while (j <= n && x[j] - x[j - 1] <= V) ++j;
    seg[m].push_back({i, j - 1});
  }
  for (auto x : seg[m]) {
    int l = x.first, r = x.second;
    for (int i = (l), _end_ = (r); i <= _end_; ++i) lb[m][i] = l, rb[m][i] = r;
  }
  ++m;
  return;
}
void TZL() {
  scf(n, V);
  for (int i = (1), _end_ = (n); i <= _end_; ++i) scf(x[i]);
  while (V) {
    get_seg();
    V >>= 1;
  }
  for (int i = (1), _end_ = (n); i <= _end_; ++i) lb[m][i] = i, rb[m][i] = i;
  ++m;
  return;
}
void DPL() {
  for (int msk = (1), _end_ = ((1 << m) - 1); msk <= _end_; ++msk) {
    for (int i = 0, _end_ = (m); i < _end_; ++i)
      if ((msk >> i) & 1) {
        chkmax(dpl[msk], dpl[msk ^ (1 << i)]);
        chkmax(dpl[msk], rb[i][dpl[msk ^ (1 << i)] + 1]);
      }
  }
  return;
}
void DPR() {
  dpr[0] = n + 1;
  for (int msk = (1), _end_ = ((1 << m) - 1); msk <= _end_; ++msk) {
    dpr[msk] = n + 1;
    for (int i = 0, _end_ = (m); i < _end_; ++i)
      if ((msk >> i) & 1) {
        chkmin(dpr[msk], dpr[msk ^ (1 << i)]);
        chkmin(dpr[msk], lb[i][dpr[msk ^ (1 << i)] - 1]);
      }
  }
  return;
}
vector<pair<int, int> > all;
bool ans[N];
int TOT;
void check(int l, int r) {
  for (int msk = 2; msk < (1 << m); msk += 2) {
    int lb = dpl[msk], rb = dpr[TOT ^ msk];
    if (l <= lb + 1 && r >= rb - 1) {
      for (int i = (l), _end_ = (r); i <= _end_; ++i) ans[i] = 1;
      return;
    }
  }
  return;
}
void RANK1() {
  if ((int)seg[0].size() <= m) {
    DPL();
    DPR();
    TOT = (1 << m) - 2;
    for (auto x : seg[0]) check(x.first, x.second);
  }
  for (int i = (1), _end_ = (n); i <= _end_; ++i)
    puts(ans[i] ? "Possible" : "Impossible");
  return;
}
