#include<algorithm>
#include<cstring>
#include<cctype>
#include<cstdio>
#include<vector>
#define rep(i,x,y) for(int i=x; i<=y; ++i)
#define repd(i,x,y) for(int i=x; i>=y; --i)
#define pb push_back

using namespace std;
const int N=200005,M=20;
bool ans[N];
int n,m,a[N],c;
int g1[M][N],g2[M][N],f1[1<<M],f2[1<<M];
vector <int> vt[N],Q[N];
struct data{int x,y;} dat[N];

int getint()
{
	char ch;
	int f=1;
	while(!isdigit(ch=getchar())) if(ch=='-') f=-1;
	int x=ch-48;
	while(isdigit(ch=getchar())) x=x*10+ch-48;
	return x*f;
}

int main()
{
	n=getint(),m=getint();
	rep(i,1,n) a[i]=getint();
	for(int x=m; ; x>>=1,++c)
	{
		int i=1,j=1;
		while(j+1<=n && a[j+1]-a[j]<=x) ++j;
		rep(k,1,n+1) g2[c][k]=n+1;
		rep(k,1,n)
		{
			if(k>j) i=j=k;
			while(j+1<=n && a[j+1]-a[j]<=x) ++j;
			if(!c) dat[k]=(data){i,j};
			else
			{
				g1[c][i]=max(g1[c][i],j);
				g2[c][j]=min(g2[c][j],i);
			}
		}
		g1[c][n+1]=n,g2[c][0]=1;
		rep(k,1,n) g1[c][i]=max(g1[c][i],g1[c][i-1]);
		repd(k,n,1) g2[c][i]=min(g2[c][i],g2[c][i+1]);
		if(!x) break;
	}
	rep(i,0,(1<<c)-1) f2[i]=n+1;
	rep(i,0,(1<<c)-1)
	{
		rep(j,0,c-1) if(!(i&(1<<j)))
		{
			f1[i|(1<<j)]=max(f1[i|(1<<j)],g1[j+1][f1[i]+1]);
			f2[i|(1<<j)]=min(f2[i|(1<<j)],g2[j+1][f2[i]-1]);
		}
	}
	int S=(1<<c)-1;
	rep(i,0,S)
	{
		int x=min(f1[i]+1,n);
		int y=max(f2[S^i]-1,1);
		vt[x].pb(y);
	}
	rep(i,1,n) Q[dat[i].x].pb(i);
	int p=n+1;
	repd(i,n,1)
	{
		int sz=vt[i].size();
		rep(j,0,sz-1) p=min(p,vt[i][j]);
		sz=Q[i].size();
		rep(j,0,sz-1) ans[Q[i][j]]=p<=dat[Q[i][j]].y;
	}
	rep(i,1,n) if(ans[i]) puts("Possible"); else puts("Impossible");
	return 0;
}
	