#include <iostream>
#include <cstdio>
#include <cstring>
#include <ctype.h>
#include <algorithm>
#define mp make_pair
#define l first
#define r second
#define BIT(x) (__builtin_popcount(x))
#define Debug(...) fprintf(stdout, __VA_ARGS__)

using namespace std;

typedef long long LL;
typedef pair<int, int> pii;
typedef pair<int, LL> pil;

const int MAXN = 3e5 + 7;
const int LogV = 19;

template<typename T> inline T read() {
	T res = 0, flag = 1; char in = getchar();
	while(!isdigit(in)) { if(in == '-') flag = -1; in = getchar(); }
	while(isdigit(in)) { res = (res << 1) + (res << 3) + in - '0'; in = getchar(); }
	return res * flag;
}

template<typename T> inline void chkmax(T &a, T b) { if(a < b) a = b; }
template<typename T> inline void chkmin(T &a, T b) { if(a > b) a = b; }

int n, v, cnt;
int p[MAXN];
int suf[MAXN], pre[MAXN];
int nst[MAXN];
char str[2][100] = {"Possible", "Impossible"};

struct Floor {
	pii seg[MAXN];
	int tot;

	inline void GetSeg(int len) {
		int lst = 1, pos = 1;
		while(lst <= n) {
			while(pos + 1 <= n && (p[pos + 1] - p[pos]) <= len) ++pos;
			seg[++tot] = mp(lst, pos);
			++pos; lst = pos;
		}
	}
}fl[LogV];

inline void GetTrans() {
	int All = 1 << cnt;

	for(int i = 1; i <= cnt; ++i) {
		pre[1 << (i - 1)] = fl[i].seg[1].r;
//		printf("FF %d\n", fl[i].tot);
	}
	for(int sta = 1; sta < All; ++sta) {
		for(int i = 1; i <= cnt; ++i) {
			if((sta >> (i - 1)) & 1) continue;
			int l = 1, r = fl[i].tot;
			int nxt = sta | (1 << (i - 1));
			while(l <= r) {
				int mid = l + r >> 1;
				if(fl[i].seg[mid].l <= pre[sta] + 1) {
					chkmax(pre[nxt], fl[i].seg[mid].r), l = mid + 1;
				}
				else r = mid - 1;
			}
//			printf("%d\n", pre[sta]);
//			exit(0);
		}
	}

	memset(suf, 0x3f, sizeof suf);
	for(int i = 1; i <= cnt; ++i)
		suf[1 << (i - 1)] = fl[i].seg[fl[i].tot].l;

	for(int sta = 1; sta < All; ++sta) {
		for(int i = 1; i <= cnt; ++i) {
			if((sta >> (i - 1)) & 1) continue;
			int l = 1, r = fl[i].tot;
			int nxt = sta | (1 << (i - 1));
			while(l <= r) {
				int mid = l + r >> 1;
				if(suf[sta] - 1 <= fl[i].seg[mid].r) {
					chkmin(suf[nxt], fl[i].seg[mid].l), r = mid - 1;
				}
				else l = mid + 1;
			}
		}
	}

//	for(int i = 1; i < All; ++i) {
//		printf("GG");
//		for(int j = 1; j <= cnt; ++j) {
//			printf("%d", (i >> (j - 1)) & 1);
//		}
//		printf(" | %d\n", pre[i]);
//	}
}

inline void init() {
	n = read<int>(); v = read<int>();
	for(int i = 1; i <= n; ++i) p[i] = read<int>();

	int len = v;
	while(len) {
		fl[cnt++].GetSeg(len);
		len /= 2;
	}
	fl[cnt++].GetSeg(len);
	--cnt;
	GetTrans();
}

inline void solve() {
	memset(nst, 0x3f, sizeof nst);
	int All = (1 << cnt) - 1;
	pre[0] = 0; suf[0] = n + 1;

	for(int i = 0; i <= All; ++i) {
		chkmin(nst[pre[i]], suf[All ^ i]);
	}

	for(int i = MAXN - 1; i > 1; --i)
		chkmin(nst[i - 1], nst[i]);

//	for(int i = 0; i <= All; ++i) {
//		printf("%d %d\n", pre[i], suf[All ^ i]);
//	}

	int tp = fl[0].tot;
	for(int i = 1; i <= tp; ++i) {
		int opt = 0;
		if(fl[0].seg[i].r + 1 < nst[fl[0].seg[i].l - 1]) opt = 1;
		for(int j = fl[0].seg[i].l; j <= fl[0].seg[i].r; ++j) {
			printf("%s\n", str[opt]);
		}
	}
}

int main() {

	init();
	solve();

	return 0;
}


Measured memory_bytes: 51584