#include <bits/stdc++.h> using namespace std; typedef long long ll; int deal(int l1,int r1,int l2,int r2,int k)//区间长度2^k { if(l1>r1||l2>r2) return 0; if(l1>l2) {swap(l1,l2);swap(r1,r2);}//把第一个区间放左边 if(r2<=r1) return r2-l2+1;//如果第二个区间包含在第一个区间内 if(l1==l2) return r1-l1+1;//第一个区间包含在第二个区间内 int len=1<<k;//k从30开始,保证两个区间变换后左端点一定在左半边 if(l2>len) return deal(l1,r1,l2-len,r2-len,k);//左移 if(r1<len && r2<len ) return deal(l1,r1,l2,r2,k-1);//都在左半边,区间减半 int ans=max(deal(l1,r1,l2,len-1,k),deal(l1,r1,1,r2-len,k));//分治,l1,l2在左半边,r1r2在右半边 return max(r1-l2+1,ans);//最大值要么是重叠的部分,要么是分治之后其中一边的最大值 } int main() { ios::sync_with_stdio(false); int l1,l2,r1,r2; cin>>l1>>r1>>l2>>r2; cout<<deal(l1,r1,l2,r2,30)<<endl; }