At first, let's define function f(x) as follows: $$$ \begin{matrix} f(x) & = & \left\{ \begin{matrix} x/2 & \mbox{if } x  is even \\\ x - 1 & \mbox{otherwise } \end{matrix} \right. \end{matrix} $$$

We can see that if we choose some value v and will apply function f to it, then apply f to f(v), and so on, we'll eventually get 1. Let's write down all values we get in this process in a list and denote this list as path(v). For example, path(1) = [1], path(15) = [15, 14, 7, 6, 3, 2, 1], path(32) = [32, 16, 8, 4, 2, 1].

Let's write all lists path(x) for every x from 1 to n. The question is next: what is the maximum value y such that y is contained in at least k different lists path(x)?

Formally speaking, you need to find maximum y such that \left| \{ x ~|~ 1 ≤ x ≤ n, y ∈ path(x) \} \right| ≥ k.

Input

The first line contains two integers n and k (1 ≤ k ≤ n ≤ 10^{18}).

Output

Print the only integer — the maximum value that is contained in at least k paths.

Examples

Input


11 3


Output


5


Input


11 6


Output


4


Input


20 20


Output


1


Input


14 5


Output


6


Input


1000000 100


Output


31248

Note

In the first example, the answer is 5, since 5 occurs in path(5), path(10) and path(11).

In the second example, the answer is 4, since 4 occurs in path(4), path(5), path(8), path(9), path(10) and path(11).

In the third example n = k, so the answer is 1, since 1 is the only number occuring in all paths for integers from 1 to 20.
import java.util.*;
import java.io.*;

public class Main {
	public static void main(String args[]) {new Main().run();}

	FastReader in = new FastReader();
	PrintWriter out = new PrintWriter(System.out);
	void run(){
		work();
		out.flush();
	}
	long mod=998244353;
	long gcd(long a,long b) {
		return b==0?a:gcd(b,a%b);
	}
	long n,k;
	void work() {
		n=in.nextLong();
		k=in.nextLong();
		long ret1=0,ret2=0;
		long l=1,r=n/2+1;
		while(l<r) {
			long m=l+(r-l)/2;
			if(check(2*m)>=k) {// >k
				l=m+1;
			}else {
				r=m;
			}
		}
		ret1=(l-1)*2;
		l=1;r=n/2+2;
		while(l<r) {
			long m=l+(r-l)/2;
			if(check(2*m-1)>=k) {// >k
				l=m+1;
			}else {
				r=m;
			}
		}
		ret2=(l-1)*2-1;
		out.println(Math.max(ret1, ret2));
	}
	private long check(long m) {
		long b=0;
		long ret=0;
		if(m%2==0) {
			ret+=check(m+1);
		}
		for(;;b++) {
			if(m<=n) {
				ret+=1L<<b;//1L!!!!!!!!!!!!!!!!!!!!!!!!!
			}else {
				ret+=Math.max(0, n-(m-(1L<<b)));
				break;
			}
			long pre=m;
			m=(m<<1L)+1;
			if((m>>1L)!=pre)break;//溢出
		}
		return ret;
	}
}	



class FastReader
{
	BufferedReader br;
	StringTokenizer st;

	public FastReader()
	{
		br=new BufferedReader(new InputStreamReader(System.in));
	}

	public String next() 
	{
		if(st==null || !st.hasMoreElements())
		{
			try {
				st = new StringTokenizer(br.readLine());
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return st.nextToken();
	}

	public int nextInt() 
	{
		return Integer.parseInt(next());
	}

	public long nextLong()
	{
		return Long.parseLong(next());
	}
}