Let's denote as the number of bits set ('1' bits) in the binary representation of the non-negative integer x.
You are given multiple queries consisting of pairs of integers l and r. For each query, find the x, such that l ≤ x ≤ r, and is maximum possible. If there are multiple such numbers find the smallest of them.
The first line contains integer n — the number of queries (1 ≤ n ≤ 10000).
Each of the following n lines contain two integers li, ri — the arguments for the corresponding query (0 ≤ li ≤ ri ≤ 1018).
For each query print the answer in a separate line.
3 1 2 2 4 1 10
1 3 7
The binary representations of numbers from 1 to 10 are listed below:
110 = 12
210 = 102
310 = 112
410 = 1002
510 = 1012
610 = 1102
710 = 1112
810 = 10002
910 = 10012
1010 = 10102
solution:用位运算,从ai开始一位一位或上一个1,然后判断有没有超出bi,因为从最后面或起,可以保证最小(1在后面比在前面更小)
比如4 10
4 =1000
101 5<10
111 7<10
1111 15>10
ans=7
#include<cstdio>
#include<iostream>
using namespace std;
long long x,y,v;
int t;
int main()
{
cin>>t;
while(t--)
{
cin>>x>>y;
v=1;
while(0==0)
{
if((x|v)<=y) x=x|v; else break;
v=v<<1;
}
cout<<x<<endl;
}
return 0;
}