#include <queue>
#define OK puts("Possible")
#define NO puts("Impossible")
#include <vector>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
using namespace std;

template <typename T>
void read(T &x) {
    x = 0; bool f = 0;
    char c = getchar();
    for (;!isdigit(c);c=getchar()) if (c=='-') f=1;
    for (;isdigit(c);c=getchar()) x=x*10+(c^48);
    if (f) x=-x;
}

const int N = 200500;
int f[N<<1][24], n, v;
int x[N], R[N][24], D[100], LG;
vector<int> to;

inline int T(int x) { return 1 << x; }
inline void Mx(int &x, int y) { y > x && (x = y); }

int main() {
	read(n), read(v);
	for (int i = 1;i <= n; i++) read(x[i]);
	while (v) D[LG++] = v, v >>= 1; LG++;
	for (int i = 0;i < LG; i++) {
		R[n+1][i] = R[n][i] = n;
		if (i == 0) to.push_back(n);
		for (int j = n - 1;j >= 1; j--)
			if (x[j+1] - x[j] <= D[i]) R[j][i] = R[j+1][i];
			else {
				R[j][i] = j; if (i == 0) to.push_back(j);
			}
	}
	if (to.size() > LG) { for (int i = 1;i <= n; i++) NO; return 0; }
	if (to.size() == 1) { for (int i = 1;i <= n; i++) OK; return 0; }
	LG--; int all = (1 << LG) - 1;
	for (int i = 0;i <= all; i++) {
		for (int j = 0;j < to.size(); j++) {
			if (R[f[i][j]+1][0] == to[j]) f[i][j] = to[j];
			for (int k = 1;k <= LG; k++) {
				if (i & T(k-1)) continue;
				Mx(f[i | T(k-1)][j], R[f[i][j]+1][k]);
			}
		}
	}
	
	int block = to.size() - 1;
	for (int i = 1;i <= n; i++) {
		f[all][block] == n ? OK : NO;
		if (to[block] == i) block--;
	}
	return 0;
}