#include <cstdio>
#include <iostream>
#define MN 266666

int n, v;
int a[MN];
int f[MN], g[MN];
int b[MN];
int nxt[20][MN];
int lst[20][MN];

int main()
{
	scanf("%d%d", &n, &v);
	for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
	int x = v;
	int m = 0;
	while(x) {b[m++] = x / 2; x /= 2;}
	b[m] = v;
	
	for(int i = 0; i <= m; i++)
	{
		lst[i][1] = 1;
		for(int j = 2; j <= n; j++)
		{
			if(a[j] - a[j - 1] <= b[i]) lst[i][j] = lst[i][j - 1];
			else lst[i][j] = j;
		}
	}
	
	int tot = 0;
	for(int i = 0; i <= m; i++)
	{
		nxt[i][n] = n;
		for(int j = n - 1; j >= 1; j--)
		{
			if(a[j + 1] - a[j] <= b[i]) nxt[i][j] = nxt[i][j + 1];
			else {nxt[i][j] = j; if(i == m) tot++;}
		}
	}
	
	if(m < tot) 
	{
		for(int i = 1; i <= n; i++) puts("Impossible");
		return 0;
	}
	
	for(int S = 0; S < (1 << m); S++) g[S] = n + 1; 
	for(int S = 0; S < (1 << m); S++)
	{
		for(int i = 0; i < m; i++)
		{
			if(!((S >> i) & 1))
			{
				f[S | (1 << i)] = std::max(f[S | (1 << i)], nxt[i][f[S] + 1]);
				g[S | (1 << i)] = std::min(g[S | (1 << i)], lst[i][g[S] - 1]);
			}
		}
	}
	
	for(int i = 1; i <= n; i++)
	{
		bool ok = 0;
		for(int S = 0; S < (1 << m); S++)
		{
			int T = ((1 << m) - 1) ^ S;
			if(f[S] >= i - 1 && g[T] <= nxt[m][i] + 1) {ok = 1; break;}
		}
		for(int j = i; j <= nxt[m][i]; j++)
		{
			if(ok) puts("Possible");
			else puts("Impossible");
		}
		i = nxt[m][i];
	}
}