// I need some holiday
// But I don't wish that everyday is holiday
// Because I didn't bear the pain
// Because it wasn't a true freedom
//         ——『イヤホンと蝉時雨』·Orangestar

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
typedef unsigned int UI;
typedef pair<int, int> pii;

#define DEBUG(...) fprintf(stderr, __VA_ARGS__)
#define MP make_pair
#define fst first
#define snd second
#define SZ(u) ((int) (u).size())
#define ALL(u) (u).begin(), (u).end()

inline void proc_status()
{
	ifstream t("/proc/self/status");
	cerr << string(istreambuf_iterator<char>(t), istreambuf_iterator<char>()) << endl;
}

template<typename T> inline int chkmin(T &a, const T &b) { return b < a ? a = b, 1 : 0; }
template<typename T> inline int chkmax(T &a, const T &b) { return b > a ? a = b, 1 : 0; }
template<typename T> inline T sqr(const T &val) { return val * val; }

namespace fastIO
{
	const int MAX_BUFFER_SIZE = 1 << 16;

	char buffer[MAX_BUFFER_SIZE], *cur = buffer, *ed = buffer;

	inline char getc() { return cur == ed && (ed = (cur = buffer) + fread(buffer, 1, MAX_BUFFER_SIZE, stdin), cur == ed) ? EOF : *cur++; }
}
using fastIO::getc;

template<typename T> inline T read()
{
	register T sum(0), fg(1);
	register char ch(getc());
	for(; !isdigit(ch); ch = getc()) if(ch == '-') fg = -1;
	for(;  isdigit(ch); ch = getc()) sum = sum * 10 - '0' + ch;
	return sum * fg;
}

inline char *read_str(char *s)
{
	register char ch(getc());
	while(!isgraph(ch)) ch = getc();
	for(; isgraph(ch); ch = getc()) *s++ = ch;
	*s = '\0';
	return s;
}

// END tpl.

const int MAXN = (int) 2e5;

int n, V;

int x[MAXN + 5];

inline void input()
{
	n = read<int>(), V = read<int>();
	for(int i = 1; i <= n; ++i) x[i] = read<int>();
}

struct seg
{
	int l, r;

	inline bool operator < (const seg &rhs) { return this-> r < rhs.r; }

	seg() { }
	seg(int _l, int _r): l(_l), r(_r) { }
};

inline void solve()
{
	const int MAXD = 20;
	static int pre[MAXD + 1][MAXN + 5], suf[MAXD + 1][MAXN + 5];

	int D = 0;
	for(int d = V; d >= 0; d >>= 1, ++D)
	{
		for(int lst = 1, i = 1; i <= n; ++i)
		{
			pre[D][i] = lst;
			if(i < n && x[i + 1] - x[i] > d) lst = i + 1;
		}
		for(int lst = n, i = n; i >= 1; --i)
		{
			suf[D][i] = lst;
			if(i > 1 && x[i] - x[i - 1] > d) lst = i - 1;
		}
		if(d == 0) { ++D; break; }
	}

	static int f[1 << MAXD], g[1 << MAXD];
	for(int S = 0; S < 1 << D; ++S) f[S] = 0, g[S] = n + 1;

	f[0] = 0, g[0] = n + 1;
	for(int S = 0; S < 1 << D; ++S)
		for(int i = 0; i < D; ++i) if(!(S >> i & 1))
		{
			chkmax(f[S | 1 << i], max(f[S], suf[i][f[S] + 1]));
			chkmin(g[S | 1 << i], min(g[S], pre[i][g[S] - 1]));
		}

	static vector<seg> s;

	int fg = 0;
	for(int U = ((1 << D) - 1) ^ 1, S = 0; S < 1 << D; ++S) if(!(S & 1))
	{
		int l = f[S], r = g[U ^ S];
		if(l + 1 > r - 1) { fg = 1; break; }
		s.emplace_back(l + 1, r - 1);
	}
	if(fg) { for(int i = 1; i <= n; ++i) puts("Possible"); return; }

	sort(ALL(s));
	for(int L = 0, i = 1, j = 0; i <= n; ++i)
	{
		int l = pre[0][i], r = suf[0][i];
		while(j < SZ(s) && s[j].r <= r) chkmax(L, s[j++].l);
		puts(L >= l ? "Possible" : "Impossible");
	}
}

int main()
{
#ifdef K_ON
	freopen("E.in", "r", stdin);
	freopen("E.out", "w", stdout);
#endif

	input();
	solve();

	return 0;
}




Measured memory_bytes: 45552