总体思路:从左边界开始,想要二进制中0尽可能多,把低位的0变成1,能变成的1更多(贪心策略)

AC代码&思路:

#include<iostream>
using namespace std;
int main()
{
    ios::sync_with_stdio(0);cin.tie(0);
    int t;
    cin>>t;
    while (t--)
    {
        long long l,r;
        cin>>l>>r;//别写成cin>>l,r了
        long long res=0;
        for(int i=0; i<=sizeof(l)*8-2/*右移62(64-2)位后,看到的那一位就是第63位,再继续看下去就是看符号位了*/; i++)
        {
            if(l<=r) {res=l;}//首先就要判断,防止改第一次就不满足了如区间3(10)到3(10),或者直接令res=l,再把这两句交换顺序,其实没什么大的关系
            l|=(1LL<<i);//1LL可以写成const long long k=1;从最低位起依此把每一位改成1。因为一个二进制或0不变,或1必然变成1
        }
        
        cout<<res<<'\n';//别忘了换行
    }
    
    return 0;
}