
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;

namespace INPUT{
	const int L=1<<15;
	char _buf[L],*S,*T,c;
	char _gc(){
		if(S==T){
			T=(S=_buf)+fread(_buf,1,L,stdin);
			if(S==T) return EOF;
		}
		return *S++;
	}
	void readi(int &X){
		register bool flag;
		for(c=_gc();(c<'0'||c>'9')&&c!='-';c=_gc());
		if(c=='-') X=0,flag=true; else X=c&15,flag=false;
		for(c=_gc();c>='0'&&c<='9';X=X*10+(c&15),c=_gc());
		if(flag) X=-X;
	}
}
using INPUT::readi;

const int Maxn=4E5+5;

int N,M,K,V;
int a[Maxn];
int F[Maxn],G[Maxn];
int L[25][Maxn],R[25][Maxn];
char Ans[50],_1[50]={"Possible"},_2[50]={"Impossible"};
//int nxt[Maxn];

inline void MIN(int &x,int y){if(x>y)x=y;}
inline void MAX(int &x,int y){if(x<y)x=y;}

int main(){
	readi(N),readi(V);
	while(V>>M) ++M;
	for(int i=1;i<=N;++i) readi(a[i]);
	for(int i=0;i<=M;++i){
		L[i][1]=1;
		for(int j=2;j<=N;++j)
			if(a[j]-a[j-1]>(V>>i)) L[i][j]=j;
		for(int j=2;j<=N;++j)
			if(L[i][j]==0) L[i][j]=L[i][j-1];
		
		R[i][N]=N;
		for(int j=N-1;j>=1;--j)
			if(a[j+1]-a[j]>(V>>i)) R[i][j]=j;
		for(int j=N-1;j>=1;--j)
			if(R[i][j]==0) R[i][j]=R[i][j+1];
	}
	G[0]=N+1;
	for(int i=1;i<(1<<M);++i){
		G[i]=N+1;
		for(int j=0;j<M;++j)
			if((i>>j)&1)
				MAX(F[i],R[M-j][min(F[i-(1<<j)]+1,N)]),
				MIN(G[i],L[M-j][max(G[i-(1<<j)]-1,1)]);
	}
/*	for(int i=1;i<=N;++i)
		K+=(L[0][i]!=L[0][i-1]);
	if(K>20){
		for(int i=1;i<=N;++i)
			puts("Impossible");
		return 0;
	}
	for(int i=1,j;i<=N;++i)
		if(L[0][i]!=L[0][i-1]){
			for(j=0;j<(1<<M);++j)
				if(F[j]>=L[0][i]-1 && G[(1<<M)-1-j]<=R[0][i]+1)
					{memcpy(Ans,_1,sizeof(_1)); break ;}
			if(j==1<<M) memcpy(Ans,_2,sizeof(_2));
			printf("%s\n",Ans);
		}else printf("%s\n",Ans);*/
	memset(nxt,-1,sizeof(nxt));
	for(int i=0;i<(1<<M);++i) MAX(nxt[G[(1<<M)-1-i]],F[i]);
	for(int i=1;i<=N+1;++i) MAX(nxt[i],nxt[i-1]);
	for(int i=1;i<=N;++i)
		if(nxt[R[0][i]+1]>=L[0][i]-1)
			puts("Possible");
		else
			puts("Impossible");
	return 0;
}
