#include <bits/stdc++.h>
const bool submit = 1;
using namespace std;
template <class S, class T>
ostream& operator<<(ostream& o, const pair<S, T>& p) {
  return o << "(" << p.first << "," << p.second << ")";
}
template <class T>
ostream& operator<<(ostream& o, const vector<T>& vc) {
  o << "sz = " << vc.size() << endl << "[";
  for (const T& v : vc) o << v << ",";
  o << "]";
  return o;
}
int N, V;
const int MN = 200000;
const int MD = 18;
int D;
int x_[MN];
int d[MN - 1];
int xv2id[MN][MD];
const int MX = MN * MD;
int id2v[MX];
int id2l[MX];
int id2r[MX];
int I;
vector<int> getnext(int pid, int lim) {
  int v = id2v[pid];
  int l = id2l[pid];
  int r = id2r[pid];
  v++;
  vector<int> ret;
  int id = xv2id[l][v];
  while (true) {
    ret.push_back(id);
    if (id2r[id] == r) break;
    id++;
    if (ret.size() > lim) return {-1};
  }
  return ret;
}
map<vector<int>, bool> memo;
bool anstmp[MN];
bool can(vector<int> vi, int v) {
  if (!submit)
    cout << "vi"
         << " = " << vi << endl;
  if (!submit)
    cout << "v"
         << " = " << v << endl;
  if (vi.empty()) return 1;
  if (vi.size() > D - v) return 0;
  int K = vi.size();
  int lim = D - v;
  vector<int> vs[K];
  int sz[K];
  int sum = 0;
  for (int i = 0; i < (int)(K); i++) {
    vs[i] = getnext(vi[i], lim);
    if (!submit)
      cout << "vs[i]"
           << " = " << vs[i] << endl;
    sz[i] = vs[i].size();
    if (vs[i].front() == -1) sz[i] = 100;
    sum += sz[i];
  }
  for (int i = 0; i < (int)(K); i++) {
    if (sum - sz[i] > lim) continue;
    vector<int> nvi;
    for (int j = 0; j < (int)(K); j++)
      if (j != i) {
        for (int u : vs[j]) nvi.push_back(u);
      }
    if (can(nvi, v + 1)) {
      memo[vi] = 1;
      if (v == 0) {
        anstmp[i] = 1;
        continue;
      }
      return 1;
    }
  }
  memo[vi] = 0;
  return 0;
}
bool ans[MN];
int main() {
  cin >> N >> V;
  for (int i = 0; i < (int)(N); i++) cin >> x_[i];
  for (int i = 0; i < (int)(N - 1); i++) d[i] = x_[i + 1] - x_[i];
  for (int v = 0; v < (int)(MD); v++) {
    int l = 0;
    for (int x = 0; x < (int)(N); x++) {
      if (x == N - 1 || d[x] > V) {
        for (int i = l; i <= x; i++) xv2id[i][v] = I;
        id2v[I] = v;
        id2l[I] = l;
        id2r[I] = x + 1;
        I++;
        l = x + 1;
      }
    }
    V /= 2;
    if (V == 0) {
      D = v + 1;
      break;
    }
  }
  int K = xv2id[N - 1][0] + 1;
  if (K > D) {
    for (int i = 0; i < (int)(N); i++) {
      puts("Impossible");
    }
    return 0;
  }
  vector<int> be;
  for (int i = 0; i < (int)(K); i++) be.push_back(i);
  can(be, 0);
  for (int i = 0; i < (int)(K); i++) {
    int l = id2l[i];
    int r = id2r[i];
    bool tmp = anstmp[i];
    for (int x = l; x < r; x++) ans[x] = tmp;
  }
  for (int i = 0; i < (int)(N); i++) {
    if (ans[i])
      puts("Possible");
    else
      puts("Impossible");
  }
}
