#include <bits/stdc++.h>
using namespace std;
int N, V;
int x[200005];
int nodeInd;
struct Node {
  int l, r;
  int v;
  vector<Node> children;
  int ind;
  Node(int _l, int _r, int _v) {
    ind = nodeInd++;
    l = _l;
    r = _r;
    v = _v;
    if (!v) return;
    int L = l;
    for (int i = (l + 1); i < int(r); ++i) {
      if (x[i] > x[i - 1] + v) {
        children.push_back(Node(L, i, v / 2));
        L = i;
      }
    }
    children.push_back(Node(L, r, v / 2));
  }
};
bool ans[200005];
map<vector<int>, bool> cache;
vector<Node*> deleted;
bool rec(vector<Node*> nodes, int stepsLeft, bool init) {
  vector<int> key;
  for (int i = (0); i < int(nodes.size()); ++i) {
    key.push_back(nodes[i]->ind);
  }
  if (cache.count(key)) return cache[key];
  if (nodes.empty()) return true;
  if (nodes[0]->v == 0) return nodes.size() == 1;
  vector<Node*> newNodes;
  for (int i = (0); i < int(nodes.size()); ++i) {
    if (newNodes.size() + nodes[i]->children.size() > stepsLeft) return 0;
    for (int j = (0); j < int(nodes[i]->children.size()); ++j)
      newNodes.push_back(&(nodes[i]->children[j]));
  }
  for (int i = (0); i < int(newNodes.size()); ++i) {
    vector<Node*> newNewNodes = newNodes;
    newNewNodes.erase(newNewNodes.begin() + i);
    deleted.push_back(newNodes[i]);
    if (rec(newNewNodes, stepsLeft - 1, 0)) {
      if (init) {
        for (int j = (newNodes[i]->l); j < int(newNodes[i]->r); ++j)
          ans[j] = true;
      } else {
        cache[key] = true;
        deleted.pop_back();
        return true;
      }
    }
    deleted.pop_back();
  }
  cache[key] = false;
  return false;
}
int main() {
  scanf("%d%d", &N, &V);
  for (int i = (0); i < int(N); ++i) scanf("%d", x + i);
  Node start(0, N, V);
  vector<Node*> v;
  v.push_back(&start);
  int stepsLeft = 20;
  rec(v, stepsLeft, 1);
  for (int i = (0); i < int(N); ++i) {
    puts(ans[i] ? "Possible" : "Impossible");
  }
}
