#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
int n, m, a[200005];
int lvl[200005];
int l[1 << 19], r[1 << 19];
vector<int> dv;
int prv[19][200005], nxt[19][200005];
void solve(int *ans, int nxt[19][200005]) {
  for (int i = 0; i < n - 1; i++) {
    lvl[i] = lower_bound(dv.begin(), dv.end(), a[i + 1] - a[i]) - dv.begin();
  }
  for (int i = 0; i < m; i++) {
    nxt[i][n - 1] = n - 1;
    for (int j = n - 2; j >= 0; j--) {
      if (lvl[j] > i)
        nxt[i][j] = j;
      else
        nxt[i][j] = nxt[i][j + 1];
    }
  }
  for (int i = 0; i < (1 << m); i++) {
    for (int j = 0; j < m; j++) {
      if ((i >> j) & 1) continue;
      int cur = nxt[j][min(n - 1, ans[i] + 1)];
      ans[i | (1 << j)] = max(ans[i | (1 << j)], cur);
    }
  }
}
int dx[200005];
int main() {
  scanf("%d %d", &n, &m);
  dv.push_back(m);
  while (dv.back() >= 1) {
    dv.push_back(dv.back() / 2);
  }
  sort(dv.begin(), dv.end());
  for (int i = 0; i < n; i++) {
    scanf("%d", &a[i]);
  }
  m = dv.size();
  solve(l, nxt);
  int s = 0;
  vector<pair<int, int> > v;
  for (int i = 0; i + 1 < n; i++) {
    if (lvl[i] == dv.size()) {
      v.push_back(pair<int, int>(s, i));
      s = i + 1;
    }
  }
  v.push_back(pair<int, int>(s, n - 1));
  if (v.size() > 20) {
    while (n--) puts("Impossible");
    return 0;
  }
  for (int i = 0; i < n; i++) a[i] *= -1;
  reverse(a, a + n);
  solve(r, prv);
  for (int i = 0; i < (1 << m); i++) {
    r[i] = n - 1 - r[i];
  }
  for (int i = 0; i < m; i++) {
    for (int j = 0; j <= n - 1; j++) {
      prv[i][j] = n - 1 - prv[i][j];
    }
    reverse(prv[i], prv[i] + n);
  }
  for (auto &i : v) {
    for (int j = 0; j < (1 << (m - 1)); j++) {
      int p = (1 << (m - 1)) - j - 1;
      if (l[j] >= i.first - 1 && r[p] <= i.second + 1) {
        dx[i.first]++;
        dx[i.second + 1]--;
      }
    }
  }
  for (int i = 0; i < n; i++) {
    if (i) dx[i] += dx[i - 1];
    if (dx[i] > 0)
      puts("Possible");
    else
      puts("Impossible");
  }
}
