#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
inline long long getint() {
  long long _x = 0, _tmp = 1;
  char _tc = getchar();
  while ((_tc < '0' || _tc > '9') && _tc != '-') _tc = getchar();
  if (_tc == '-') _tc = getchar(), _tmp = -1;
  while (_tc >= '0' && _tc <= '9') _x *= 10, _x += (_tc - '0'), _tc = getchar();
  return _x * _tmp;
}
inline long long add(long long _x, long long _y,
                     long long _mod = 1000000007LL) {
  _x += _y;
  return _x >= _mod ? _x - _mod : _x;
}
inline long long sub(long long _x, long long _y,
                     long long _mod = 1000000007LL) {
  _x -= _y;
  return _x < 0 ? _x + _mod : _x;
}
inline long long mul(long long _x, long long _y,
                     long long _mod = 1000000007LL) {
  _x *= _y;
  return _x >= _mod ? _x % _mod : _x;
}
long long mypow(long long _a, long long _x, long long _mod) {
  if (_x == 0) return 1LL;
  long long _ret = mypow(mul(_a, _a, _mod), _x >> 1, _mod);
  if (_x & 1) _ret = mul(_ret, _a, _mod);
  return _ret;
}
long long mymul(long long _a, long long _x, long long _mod) {
  if (_x == 0) return 0LL;
  long long _ret = mymul(add(_a, _a, _mod), _x >> 1, _mod);
  if (_x & 1) _ret = add(_ret, _a, _mod);
  return _ret;
}
inline bool equal(double _x, double _y) {
  return _x > _y - 1e-9 && _x < _y + 1e-9;
}
int __ = 1, _cs;
void build() {}
int p[19][202020], l[19][202020], r[19][202020];
int f(int k, int x) { return p[k][x] == x ? x : p[k][x] = f(k, p[k][x]); }
void uni(int k, int x, int y) {
  x = f(k, x);
  y = f(k, y);
  l[k][y] = min(l[k][y], l[k][x]);
  r[k][y] = max(r[k][y], r[k][x]);
  p[k][x] = y;
}
int n, v[19], x[202020], vv;
void init() {
  n = getint();
  v[0] = getint();
  for (int i = 1; i <= n; i++) x[i] = getint();
  vv = 1;
  for (int i = 1; i < 19; i++) {
    v[i] = v[i - 1] / 2;
    vv++;
    if (v[i] == 0) break;
  }
  for (int i = 0; i < vv; i++) {
    for (int j = 1; j <= n; j++) p[i][j] = l[i][j] = r[i][j] = j;
    for (int j = 2; j <= n; j++)
      if (x[j] - x[j - 1] <= v[i]) uni(i, j - 1, j);
    for (int j = 1; j <= n; j++) f(i, j);
  }
}
vector<pair<int, int> > inter;
int cc, rat[202020], lat[202020];
bool okl[19][1 << 19];
bool okr[19][1 << 19];
bool ans[202020];
void solve() {
  {
    int lft = 1;
    while (lft <= n) {
      int rgt = r[0][p[0][lft]];
      inter.push_back({lft, rgt});
      lat[lft] = rat[rgt] = ++cc;
      lft = rgt + 1;
    }
  }
  if (cc > vv) {
    for (int i = 1; i <= n; i++) puts("Impossible");
    exit(0);
  }
  if (cc == 1) {
    for (int i = 1; i <= n; i++) puts("Possible");
    exit(0);
  }
  {
    queue<pair<int, int> > Q;
    set<pair<int, int> > inq;
    Q.push({0, 0});
    while (Q.size()) {
      auto tp = Q.front();
      Q.pop();
      int rgt = tp.first, msk = tp.second;
      if (rgt == n) continue;
      for (int i = 1; i < vv; i++) {
        if ((msk >> (i - 1)) & 1) continue;
        int nxt = r[i][p[i][rgt + 1]];
        int nmsk = msk | (1 << (i - 1));
        if (rat[nxt]) okl[rat[nxt] - 1][nmsk] = true;
        if (inq.count({nxt, nmsk})) continue;
        inq.insert({nxt, nmsk});
        Q.push({nxt, nmsk});
      }
    }
  }
  {
    queue<pair<int, int> > Q;
    set<pair<int, int> > inq;
    Q.push({n + 1, 0});
    while (Q.size()) {
      auto tp = Q.front();
      Q.pop();
      int lft = tp.first, msk = tp.second;
      if (lft == 1) continue;
      for (int i = 1; i < vv; i++) {
        if ((msk >> (i - 1)) & 1) continue;
        int nxt = l[i][p[i][lft - 1]];
        int nmsk = msk | (1 << (i - 1));
        if (lat[nxt]) okr[lat[nxt] - 1][nmsk] = true;
        if (inq.count({nxt, nmsk})) continue;
        inq.insert({nxt, nmsk});
        Q.push({nxt, nmsk});
      }
    }
  }
  for (int i = 0; i < cc; i++)
    for (int j = 0; j + 1 < vv; j++)
      for (int msk = 0; msk < (1 << (vv - 1)); msk++)
        if ((msk >> j) & 1) {
          okl[i][msk] |= okl[i][msk ^ (1 << j)];
          okr[i][msk] |= okr[i][msk ^ (1 << j)];
        }
  for (int i = 0; i < cc; i++) {
    bool good = false;
    if (i == 0)
      good = okr[i + 1][(1 << (vv - 1)) - 1];
    else if (i + 1 == cc)
      good = okl[i - 1][(1 << (vv - 1)) - 1];
    else {
      for (int msk = 0; msk < (1 << (vv - 1)); msk++)
        if (okl[i - 1][msk] and okr[i + 1][(1 << (vv - 1)) - 1 - msk]) {
          good = true;
          break;
        }
    }
    if (not good) continue;
    for (int j = inter[i].first; j <= inter[i].second; j++) ans[j] = true;
  }
  for (int i = 1; i <= n; i++) puts(ans[i] ? "Possible" : "Impossible");
}
int main() {
  build();
  while (__--) {
    init();
    solve();
  }
}
