A little girl loves problems on bitwise operations very much. Here's one of them.

You are given two integers *l* and *r*. Let's consider the values of <img align="middle" class="tex-formula" src="https://espresso.codeforces.com/9b77fab607849cb208cd8aab633b62d894fc3358.png" style="max-width: 100.0%;max-height: 100.0%;"/> for all pairs of integers *a* and *b* (*l* ≤ *a* ≤ *b* ≤ *r*). Your task is to find the maximum value among all considered ones.

Expression <img align="middle" class="tex-formula" src="https://espresso.codeforces.com/b364f2e04c665b78b924ec10666327a4ef4635bc.png" style="max-width: 100.0%;max-height: 100.0%;"/> means applying bitwise excluding or operation to integers *x* and *y*. The given operation exists in all modern programming languages, for example, in languages *C*++ and *Java* it is represented as "^", in *Pascal* — as "xor".
The single line contains space-separated integers *l* and *r* (1 ≤ *l* ≤ *r* ≤ 10<sup class="upper-index">18</sup>).

Please, do not use the %lld specifier to read or write 64-bit integers in C++. It is preferred to use the cin, cout streams or the %I64d specifier.
one, two = list(map(int, input().split()))

ones = list(bin(one)[2:])
twos = list(bin(two)[2:])

if len(ones) == len(twos):
    maximum = two ^ one
    for x in range(one, two):
        maximum = max(maximum, x * two)
    
    print(maximum)
else:

    length1 = len(ones)
    length2 = len(twos)
    index = length2

    
    while length1 != length2:
        
        twos[index - length2] = "1"
        length2 -= 1
    

    start = index - length2
    really = index - length2

    while start < len(twos):

        if ones[start - really] == twos[start] and ones[start - really] == "0":
            twos[start] = "1"
        
        elif ones[start - really] != twos[start]:
            twos[start] = '1'
        
        start += 1
    
    print(int("".join(twos), 2))