#include<bits/stdc++.h>
using namespace std;

#define int long long
#define pb push_back
#define ins insert
#define pii pair<int,int>
#define fs first
#define sc second
#define mpr make_pair
#define iter iterator
#define all(X) X.begin(),X.end()
#define sau(X) sort(all(X)),X.resize(unique(all(X))-X.begin())
#define exist(X,ele) binary_search(all(X),ele)

template<typename T1,typename T2>
ostream& operator << (ostream& out,const pair<T1,T2>& X)
{
	out<<"{"<<X.fs<<","<<X.sc<<"}";
	return out;
}

template<typename T>
ostream& operator << (ostream& out,const vector<T>& X)
{
	for(auto i:X) out<<i<<" ";
	return out;
}

inline void cmin(int& x,int y)
{
	x=min(x,y);
}

inline void cmax(int& x,int y)
{
	x=max(x,y);
}

const int inf=5000000000000000ll;

int N,V;
vector<int> a;
int p[20][200010];
int nxt[20][200010][2];
bool ans[200010];
int cnt=0;

inline string t(int x)
{
	string res="";
	for(int i=0;i<=5;i++)
	{
		res+=(bool)(x&(1<<i))+'0';
	}
	return res;
}

inline bool solve(int L,int R,int U)
{
//	cout<<"  Solving "<<setw(4)<<left<<L<<setw(4)<<left<<R<<t(U)<<endl;
	
	vector<int> v;
	for(int i=0;i<=cnt;i++)
	{
		if(U&(1<<i)) v.pb(i);
	}
	int U2=(1<<(int)v.size())-1;
	vector<int> dp((1<<(int)v.size()),-1);
	dp[0]=L;
	for(int msk=0;msk<=U2;msk++)
	{
		if(dp[msk]==-1) continue;
		for(int j=0;j<v.size();j++)
		{
			if(!(msk&(1<<j)))
			{
				cmax(dp[msk|(1<<j)],dp[msk]);
				cmax(dp[msk|(1<<j)],nxt[v[j]][dp[msk]][0]);
			}
		}
	}
//	for(int msk=0;msk<=U2;msk++)
//	{
//		cout<<"msk="<<t(msk)<<" dp[msk]="<<dp[msk]<<endl;
//	}
//	cout<<" Ret : "<<(dp[U2]>R)<<endl;
	return dp[U2]>R;
}

main()
{
	ios::sync_with_stdio(false);
	
	cin>>N>>V;
	for(int i=0,x;i<N;i++)
	{
		cin>>x;
		a.pb(x);
	}
	for(int i=0,v=V,lv=-1;v!=lv;i++,lv=v,v/=2)
	{
		for(int j=1;j<N;j++)
		{
			p[i][j]=p[i][j-1];
			if(a[j]-a[j-1]>v) p[i][j]++;
		}
		cnt++;
	}
	for(int i=0,v=V,lv=-1;v!=lv;i++,lv=v,v/=2)
	{
		for(int j=0;j<N;j++)
		{
			if(j && p[i][j]==p[i][j-1])
			{
				nxt[i][j][0]=nxt[i][j-1][0];
				nxt[i][j][1]=nxt[i][j-1][1];
				continue;
			}
			nxt[i][j][0]=(upper_bound(p[i],p[i]+N,p[i][j])-p[i]);   // [j, )
			nxt[i][j][1]=(lower_bound(p[i],p[i]+N,p[i][j])-p[i])-1; // ( ,j]
		}
//		cout<<"D="<<i<<endl;
//		for(int j=0;j<N;j++) cout<<nxt[i][j][0]<<" "; cout<<endl;
//		for(int j=0;j<N;j++) cout<<nxt[i][j][1]<<" "; cout<<endl;
	}
	for(int i=0;i<N;i++)
	{
//		cout<<"StartPos="<<i<<endl;
		if(i!=0 && nxt[0][i][0]==nxt[0][i-1][0])
		{
			ans[i]=ans[i-1];
			continue;
		}
		ans[i]=false;
		int U=((1<<(cnt+1))-2); 
		for(int mskL=0;mskL<=U;mskL++)
		{
			if(mskL&1) continue;
			int mskR=U^mskL;
			if(nxt[0][i][1]<0 && mskL) continue;
			if(nxt[0][i][0]>=N && mskR) continue;
			if(nxt[0][i][1]>=0 && nxt[0][i][0]<N && ((!mskL)||(!mskR)) ) continue;
			bool ok=true;
			if(nxt[0][i][1]>=0) ok&=solve(0,nxt[0][i][1],mskL);
			if(nxt[0][i][0]<N) ok&=solve(nxt[0][i][0],N-1,mskR);
			ans[i]|=ok;
		}
	}
	for(int i=0;i<N;i++)
	{
		if(ans[i]) cout<<"Possible"<<endl;
		else cout<<"Impossible"<<endl;
	}
	
	return 0;
}




















