#include <cstdio>
#include <algorithm>
using namespace std;
 
#define iter(i, n) forw(i, 1, n)
#define iter0(i, n) for (int i = 0; i < n; ++i)
#define iter_r(i, n) for (int i = n; i >= 1; --i)
#define forw(i, a, b) for (int i = a; i <= b; ++i)
 
#define NR 201000
 
bool mark[NR];
int n, V, x[NR], v[20], pre[NR][20], suc[NR][20], l, f[601000], g[601000];
 
int main() {
	scanf("%d%d", &n, &V);
	for (; V > 0; V = V / 2) v[l++] = V; v[l++] = 0;
	iter(i, n) scanf("%d", &x[i]);
	
	iter0(i, l) suc[n][i] = n, pre[1][i] = 1;
	forw(i, 2, n) iter0(k, l) pre[i][k] = (x[i] - x[i - 1] <= v[k] ? pre[i - 1][k] : i);
	iter_r(i, n - 1) iter0(k, l) suc[i][k] = (x[i + 1] - x[i] <= v[k] ? suc[i + 1][k] : i);
 
 
 
	int M = 1 << l;
	iter0(s, M) g[s] = n + 1;
	iter0(s, M) {
		//printf(": %d %d %d\n", s, f[s], g[s]);
		iter0(i, l) if (!(s >> i & 1)) {
			f[s ^ (1 << i)] = max(f[s ^ (1 << i)], f[s] == n ? n : suc[f[s] + 1][i]);
			g[s ^ (1 << i)] = min(g[s ^ (1 << i)], g[s] == 1 ? 1 : pre[g[s] - 1][i]);
		}
	}
 
	bool all = false;
	iter0(s, M) if (!(s & 1)) {
		int t = M - 1 - s - 1;
		int l = f[s], r = g[t];
		//printf("!%d %d %d\n", l, r, suc[l+1][0]);
 
		if (l + 1 >= r) all = true;
		else if (suc[l + 1][0] >= r - 1) mark[l + 1] = true;
	}
 
	if (all) iter(i, n) mark[i] = true;
 
	int r = 0;
	iter(i, n) {
		if (mark[i]) r = suc[i][0];
		puts(i <= r ? "Possible" : "Impossible");
	}
	return 0;
}