Problem: There are N oases on a number line. The coordinate of the i-th oases from the left is x_i.

Camel hopes to visit all these oases. Initially, the volume of the hump on his back is V. When the volume of the hump is v, water of volume at most v can be stored. Water is only supplied at oases. He can get as much water as he can store at a oasis, and the same oasis can be used any number of times.

Camel can travel on the line by either walking or jumping:

* Walking over a distance of d costs water of volume d from the hump. A walk that leads to a negative amount of stored water cannot be done.
* Let v be the amount of water stored at the moment. When v>0, Camel can jump to any point on the line of his choice. After this move, the volume of the hump becomes v/2 (rounded down to the nearest integer), and the amount of stored water becomes 0.



For each of the oases, determine whether it is possible to start from that oasis and visit all the oases.

Constraints

* 2 ≤ N,V ≤ 2 × 10^5
* -10^9 ≤ x_1 < x_2 < ... < x_N ≤ 10^9
* V and x_i are all integers.

Input

Input is given from Standard Input in the following format:


N V
x_1 x_2 ... x_{N}


Output

Print N lines. The i-th line should contain `Possible` if it is possible to start from the i-th oasis and visit all the oases, and `Impossible` otherwise.

Examples

Input

3 2
1 3 6


Output

Possible
Possible
Possible


Input

7 2
-10 -4 -2 0 2 4 10


Output

Impossible
Possible
Possible
Possible
Possible
Possible
Impossible


Input

16 19
-49 -48 -33 -30 -21 -14 0 15 19 23 44 52 80 81 82 84


Output

Possible
Possible
Possible
Possible
Possible
Possible
Possible
Possible
Possible
Possible
Possible
Possible
Impossible
Impossible
Impossible
Impossible

Solution (in CPP):

Solution:
#include<bits/stdc++.h>
#define MAXN 1000000
#define INF 2000000000
using namespace std;
int n,V,x[MAXN+5];
int cnt[25];
int l[25][MAXN+5],r[25][MAXN+5];
int f1[MAXN*5+5],f2[MAXN*5+5];//如思路中的定义
bool ans[MAXN+5];//ans记录的是对于某一条线段的答案，不是某个绿洲的答案
void Init()
{
	for(int i=0;i<=MAXN*5+3;i++)
		f1[i]=0,f2[i]=INF;
}
int UpFind(int id,int pos)//找l在pos+1的左边的线段，也就是能够向右扩展的最靠右的线段
{
	pos++;
	int p=upper_bound(l[id]+1,l[id]+cnt[id]+1,pos)-l[id];
	p--;
	if(p<=0)
		return pos;
	return max(r[id][p],pos-1);
}
int LowFind(int id,int pos)//找r在pos-1的右边的线段，也就是能够向左扩展的最靠左的线段
{
	pos--;
	int p=lower_bound(r[id]+1,r[id]+cnt[id]+1,pos)-r[id];
	if(p>=cnt[id]+1)
		return pos;
	return min(l[id][p],pos+1);
}
int main()
{
	Init();
	scanf("%d %d",&n,&V);
	int logV=0;
	for(logV=0;(1<<logV)<=V;logV++);//求出来的实际上是logV+1
	for(int i=1;i<=n;i++)
		scanf("%d",&x[i]);
	x[n+1]=INF;
	x[0]=-INF;//便于操作
	for(int LG=0;LG<=logV;LG++)
	{
		int d=V/(1<<LG);
		cnt[LG]=1;
		l[LG][1]=1;
		//求线段
		for(int i=1;i<=n;i++)
		{
			r[LG][cnt[LG]]=i;
			if(x[i+1]-x[i]>d)
			{
				cnt[LG]++;
				l[LG][cnt[LG]]=i+1;
			}
		}
		cnt[LG]--;
	}
	if(cnt[0]>logV+1)//特判
	{
		for(int i=1;i<=n;i++)
			printf("Impossible\n");
		return 0;
	}
	int all=(1<<(logV+1));
	f1[0]=0,f2[0]=n+1;//预处理两个f数组
	for(int s=0;s<all;s+=2)
		for(int i=0;i<=logV;i++)
		{
			if(!(s&(1<<i)))
				continue;
			f1[s]=max(f1[s],UpFind(i,f1[s-(1<<i)]));
			f2[s]=min(f2[s],LowFind(i,f2[s-(1<<i)]));
		}
	for(int i=1;i<=cnt[0];i++)
	{
		int ln=l[0][i],rn=r[0][i];
		for(int s1=0;s1<all;s1+=2)
		{
			int s2=all-1-s1-1;
			int lpos=f1[s1];
			int rpos=f2[s2];
			if(lpos>=ln-1&&rpos<=rn+1)
			{
				ans[i]=true;
				break;
			}
		}
	}
	int pos=1;
	for(int i=1;i<=n;i++)
	{
		if(ans[pos]==true)
			printf("Possible\n");
		else
			printf("Impossible\n");
		if(x[i+1]-x[i]>V)
			pos++;
	}
	return 0;
}