#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
int nxt[21][202020];
int bef[21][202020];
int dp1[1102020], dp2[1102020];
int d[202020];
int ans[202020];
int main()
{
	int num, gen;
	scanf("%d%d", &num, &gen);
	d[0] = -1010101010, d[num + 1] = 1010101010;
	for (int i = 1; i <= num; i++)scanf("%d", &d[i]);
	int pt = 0;
	for (;;)
	{
		int now = 0;
		for (int i = 1; i <= num + 1; i++)
		{
			if (d[i] - d[i - 1] > gen)now = i - 1;
			bef[pt][i] = now;
		}
		bef[pt][0] = 0;
		now = num + 1;
		for (int i = num; i >= 0; i--)
		{
			if (d[i + 1] - d[i] > gen)now = i + 1;
			nxt[pt][i] = now;
		}
		nxt[pt][num + 1] = num + 1;
		pt++;
		if (gen == 0)break;
		gen /= 2;
	}
	//for (int i = 0; i <= num + 1; i++)printf("%d %d\n", nxt[0][i], bef[0][i]);
	fill(dp1, dp1 + (1 << pt), 1);
	for (int p = 0; p < (1 << pt); p++)
	{
		for (int i = 0; i < pt; i++)
		{
			if (p&(1 << i))continue;
			dp1[p + (1 << i)] = max(dp1[p + (1 << i)], nxt[i][dp1[p]]);
		}
	}
	fill(dp2, dp2 + (1 << pt), num);
	for (int p = 0; p < (1 << pt); p++)
	{
		for (int i = 0; i < pt; i++)
		{
			if (p&(1 << i))continue;
			dp2[p + (1 << i)] = min(dp2[p + (1 << i)], bef[i][dp2[p]]);
		}
	}
	//for (int i = 0; i < (1 << pt); i++)printf("%d %d\n", dp1[i], dp2[i]);
	for (int p = 0; p < (1 << pt); p+=2)
	{
		int q = (1 << pt) - 2 - p;
		if (nxt[0][dp1[p]]>dp2[q])ans[dp1[p]] = 1;
	}
	int t = 0;
	for (;;)
	{
		if (ans[t])
		{
			for (int j = t; j < nxt[0][t]; j++)ans[j] = 1;
			t = nxt[0][t];
		}
		else t++;
		if (t == num + 1)break;
	}
	for (int i = 1; i <= num; i++)printf(ans[i] ? "Possible\n" : "Impossible\n");
}