注意到l,r非常的大,因此想到利用位运算。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
long long a[100];///位运算爆int
int cnt;
int main(){
// freopen("in.txt", "r", stdin);
int cas;
scanf("%d",&cas);
while(cas--){
LL l,r;
scanf("%I64d%I64d",&l,&r);
cnt = 0;
LL ans = l;
while(l > 0){
a[cnt++] = l%2;
l >>= 1;
}
for(int i=0; ; i++){
a[i] = 1;
LL tmp = 0;
for(int j=0; j<max(i+1,cnt); j++)
tmp += (a[j] << j);
if(tmp <= r) ans = tmp;
else break;
}
printf("%I64d\n",ans);
}
return 0;
}