#include <bits/stdc++.h>
const int INF = 1e9 + 7;
const long long INFLL = 1e17;
using namespace std;
const int maxn = 2e5 + 5;
int n, m, lvl;
int arr[maxn];
vector<vector<pair<int, pair<int, int> > > > seg;
int par[maxn * 20];
vector<int> adj[20 * maxn];
int sz[maxn * 20], deg[maxn * 20];
int cmp(int a, int b) {
  if (deg[a] == deg[b]) return sz[a] > sz[b];
  return deg[a] > deg[b];
}
int ans[maxn], dp[maxn];
int solve(vector<int> tmp, int remaining) {
  int expand = 0;
  for (int k = (int)0; k < (int)tmp.size(); k++) expand += deg[tmp[k]];
  if (expand > remaining) return 0;
  if (tmp.size() == 0) return 1;
  vector<int> nxt;
  for (int i : tmp)
    for (int j : adj[i]) nxt.push_back(j);
  sort(nxt.begin(), nxt.end(), cmp);
  vector<int> cur = nxt;
  for (int k = (int)0; k < (int)nxt.size(); k++) {
    swap(cur[k], cur.back());
    cur.pop_back();
    if (solve(cur, remaining - 1)) return 1;
    cur.push_back(nxt[k]);
    swap(cur[k], cur.back());
  }
  return 0;
}
void dfs(int a, int build) {
  if (build) {
    sz[a] = 1;
    deg[a] = adj[a].size();
    for (int b : adj[a]) {
      dfs(b, 1);
      sz[a] += sz[b];
    }
    return;
  }
  if (a == n) {
    if (adj[a].size() <= lvl) {
      vector<int> now = adj[a];
      for (int k = (int)0; k < (int)now.size(); k++) {
        vector<int> tmp;
        for (int i = (int)0; i < (int)now.size(); i++)
          if (k != i) tmp.push_back(now[i]);
        dp[k] = solve(tmp, lvl - 1);
      }
    }
  }
}
int main() {
  scanf("%d%d", &n, &m);
  for (int k = (int)0; k < (int)n; k++) scanf("%d", &arr[k]);
  vector<int> cur;
  while (m) {
    cur.push_back(m);
    m /= 2;
  }
  cur.push_back(0);
  lvl = cur.size();
  int hit = 0;
  for (int k = (int)0; k < (int)cur.size(); k++) {
    vector<pair<int, pair<int, int> > > tmp;
    for (int i = (int)0; i < (int)n; i++) {
      int j = i + 1;
      while (j != n && arr[j] - arr[j - 1] <= cur[k]) j++;
      tmp.push_back(make_pair(hit++, make_pair(i, j - 1)));
      i = j - 1;
    }
    seg.push_back(tmp);
    if (k) {
      int j = 0;
      for (int i = (int)0; i < (int)seg[k].size(); i++) {
        pair<int, int> now = seg[k][i].second;
        while (j < seg[k - 1].size()) {
          pair<int, int> parn = seg[k - 1][j].second;
          if (parn.first <= now.first && now.second <= parn.second) break;
          j++;
        }
        par[seg[k][i].first] = seg[k - 1][j].first;
      }
    }
  }
  int N = n;
  m = seg[0].size();
  n = hit;
  for (int k = (int)m; k < (int)n; k++) adj[par[k]].push_back(k);
  for (int k = (int)0; k < (int)m; k++) adj[n].push_back(k);
  dfs(n, 1);
  dfs(n, 0);
  for (int k = (int)0; k < (int)m; k++) {
    for (int i = (int)seg[0][k].second.first;
         i < (int)seg[0][k].second.second + 1; i++)
      ans[i] = dp[k];
  }
  for (int k = (int)0; k < (int)N; k++)
    printf("%s\n", ans[k] ? "Possible" : "Impossible");
}
