题意:
给你 n 个区间,求区间内数的二进制包含 1 最多的一个数,如果存在多个数输出最小的那个
思路:
将输入区间的左边界从低位到高位 将每一位与1相或(从低位开始能保证最小),如果超出区间的右边界则与1相或前的数即为答案。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cmath>
#include<stack>
#include<vector>
#define mod 10007
using namespace std;
typedef long long ll;
const int maxn = 1e6+10;
int main()
{
int n;
ll l,r;
ll x;
scanf("%d",&n);
while(n--)
{
x = 1;
scanf("%lld %lld",&l,&r);
while(1)
{
if((l|x)<=r)
l = (l|x);
else
break;
x<<=1;
}
printf("%lld\n",l);
}
return 0;
}