#include <bits/stdc++.h>
using namespace std;
int N, V;
const int maxn = 200010;
int x[maxn];
int cnt = 0;
int dep;
vector<int> g[maxn * 20];
vector<int> divide(int l, int r, int v) {
  vector<int> ret;
  if (r - l == 1 || v == 0) return ret;
  for (int i = l, j; i < r; i = j) {
    ret.push_back(++cnt);
    for (j = i + 1; j < r && x[j] - x[j - 1] <= v; ++j)
      ;
    g[*ret.rbegin()] = divide(i, j, v / 2);
  }
  return ret;
}
bool ans[maxn];
bool solve(const vector<int> &vec, int dep) {
  vector<int> nxt;
  for (auto x : vec)
    if (g[x].empty())
      nxt.push_back(x);
    else
      nxt.insert(nxt.end(), g[x].begin(), g[x].end());
  if (nxt.size() > dep) return false;
  if (nxt.size() == 1) return true;
  int last = *(nxt.end() - 1), sz = nxt.size();
  nxt.erase(nxt.end() - 1);
  for (int i = sz - 1; i >= 0; --i) {
    if (solve(nxt, dep - 1)) return true;
    if (i) swap(nxt[i - 1], last);
  }
  return false;
}
int main() {
  scanf("%d%d", &N, &V);
  for (int i = 0; i < N; ++i) scanf("%d", &x[i]);
  g[0] = divide(0, N, V);
  for (int x = V; x; x = x >> 1) ++dep;
  if (g[0].size() > dep + 1) {
    for (int i = 0; i < N; ++i) puts("Impossible");
    return 0;
  }
  if (g[0].size() == 1) {
    for (int i = 0; i < N; ++i) puts("Possible");
    return 0;
  }
  for (int i = 0; i < g[0].size(); ++i) {
    vector<int> cur = g[0];
    cur.erase(cur.begin() + i);
    ans[i] = solve(cur, dep);
  }
  int curb = 0;
  for (int i = 0; i < N; ++i) {
    if (i && x[i] - x[i - 1] > V) ++curb;
    puts(ans[curb] ? "Possible" : "Impossible");
  }
  return 0;
}
