#include <bits/stdc++.h>
using namespace std;
const long long int INF = 99999999999999, inf = 199999;
const long long int mod = 1000000007;
long long int tmp, n, canmove[25] = {}, v, x[200005], leftdp[800000] = {},
                      rightdp[800000] = {};
long long int leftnext[25][800005] = {}, rightnext[25][800005] = {},
              two[30] = {1};
long long int leftmemo[800005] = {}, rightmemo[800005] = {};
long long int cou = 0, k;
void leftsolve() {
  long long int count = 0;
  queue<long long int> que, memoque;
  que.push(0);
  leftdp[0] = 1;
  while (1) {
    while (!que.empty()) {
      for (int i = 0; i < k; i++) {
        if ((que.front() / two[i] % 2) == 0) {
          leftdp[que.front() + two[i]] = max(leftdp[que.front() + two[i]],
                                             leftnext[i][leftdp[que.front()]]);
          if (leftmemo[que.front() + two[i]] == 0) {
            memoque.push(que.front() + two[i]);
            leftmemo[que.front() + two[i]] = 1;
          }
        }
      }
      que.pop();
    }
    while (!memoque.empty()) {
      que.push(memoque.front());
      memoque.pop();
    }
    if (que.front() == two[k] - 1) {
      break;
    }
  }
}
void rightsolve() {
  long long int count = 0;
  queue<long long int> que, memoque;
  que.push(0);
  while (1) {
    while (!que.empty()) {
      for (int i = 0; i < k; i++) {
        if ((que.front() / two[i]) % 2 == 0) {
          rightdp[que.front() + two[i]] =
              min(rightdp[que.front() + two[i]],
                  rightnext[i][rightdp[que.front()]]);
          if (rightmemo[que.front() + two[i]] == 0) {
            memoque.push(que.front() + two[i]);
            rightmemo[que.front() + two[i]] = 1;
          }
        }
      }
      que.pop();
    }
    while (!memoque.empty()) {
      que.push(memoque.front());
      memoque.pop();
    }
    if (que.front() == two[k] - 1) {
      break;
    }
  }
}
int main() {
  map<long long int, long long int> mp;
  cout << fixed << setprecision(10);
  cin >> n >> v;
  for (int i = 1; i <= 26; i++) {
    two[i] = 2 * two[i - 1];
  }
  for (int j = 0; j <= 199995; j++) {
    rightdp[j] = n;
  }
  tmp = v;
  while (tmp != 0) {
    canmove[cou] = tmp;
    cou++;
    tmp /= 2;
  }
  k = cou + 1;
  for (int i = 1; i <= n; i++) {
    cin >> x[i];
  }
  x[0] = INF;
  x[n + 1] = INF;
  for (int i = 0; i < k; i++) {
    tmp = 0;
    for (int j = 2; j <= n + 1; j++) {
      if (x[j] - x[j - 1] > canmove[i]) {
        for (int p = tmp; p < j; p++) {
          leftnext[i][p] = j;
        }
        tmp = j;
      }
    }
    tmp = n;
    for (int j = n - 1; j >= 0; j--) {
      if (x[j + 1] - x[j] > canmove[i]) {
        for (int p = tmp; p > j; p--) {
          rightnext[i][p] = j;
        }
        tmp = j;
      }
    }
  }
  leftsolve();
  rightsolve();
  for (int i = 1; i <= n; i++) {
  }
  for (int i = 1; i <= n; i = leftnext[0][i]) {
    bool key = true;
    for (int j = 0; j < two[k]; j += 2) {
      if (leftdp[j] > rightnext[0][i] &&
          rightdp[(j ^ (two[k] - 2))] < leftnext[0][i]) {
        for (int p = rightnext[0][i] + 1; p <= leftnext[0][i] - 1; p++) {
          cout << "Possible" << endl;
        }
        key = false;
        break;
      }
    }
    if (key) {
      for (int p = rightnext[0][i] + 1; p <= leftnext[0][i] - 1; p++) {
        cout << "Impossible" << endl;
      }
    }
  }
}
