为什么第二个二分在跑样例1时会死循环?
#include<bits/stdc++.h>
#define ll long long
#define log djkdjdjjd
using namespace std;
int log[200005];
ll a[200005],b[200005];
ll sta[200005][40],stb[200005][40];
ll ra(int l,int r){
int len=log[r-l+1];
//printf("len=%d\n",r-(1<<len)+1);
return max(sta[l][len],sta[r-(1<<len)+1][len]);
}
ll rb(int l,int r){
int len=log[r-l+1];
return min(stb[l][len],stb[r-(1<<len)+1][len]);
}
int main()
{
for(int i=1;i<=200000;i++)
{
if(i%2==0)
{
log[i]=log[i/2]+1;
}
else
log[i]=log[i-1];
}
//printf("%d\n",log[7]);
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
for(int i=1;i<=n;i++)
scanf("%lld",&b[i]);
for(int i=1;i<=n;i++)
sta[i][0]=a[i],stb[i][0]=b[i];
for(int l=1;l<=20;l++)
{
int r=1<<l;
for(int i=1;i+r-1<=n;i++)
{
sta[i][l]=max(sta[i][l-1],sta[i+(1<<(l-1))][l-1]);
stb[i][l]=min(stb[i][l-1],stb[i+(1<<(l-1))][l-1]);
}
}
//printf("%d\n",sta[2][2]);
//printf("%d\n",ra(5,5));
//return 0;
ll ans=0;
for(int i=1;i<=n;i++)
{
ll l1=i,r1=n,l2=i,r2=n,mid;
int tmp=0;
while(l1<r1)
{
tmp++;
if(tmp>100)
break;
mid=(l1+r1)/2;
if(ra(i,mid)<rb(i,mid))
{
l1=mid+1;
}
else if(ra(i,mid)>rb(i,mid))
{
r1=mid-1;
}
else
{
r1=mid;
}
}
if(l1!=i && ra(i,l1-1)==rb(i,l1-1))
l1--;
tmp=0;
while(l2<r2)
{
tmp++;
if(tmp>100)
break;
mid=(l2+r2)/2;
//printf("%d %d\n",l2,r2);
if(ra(i,mid)<rb(i,mid))
{
l2=mid+1;
}
else if(ra(i,mid)>rb(i,mid))
{
r2=mid-1;
}
else
{
l2=mid;
}
}
if(l2!=n && ra(i,l2+1)==rb(i,l2+1))
l2++;
//printf("i=%d l1=%d l2=%d\n",i,l1,l2);
//printf("%d %d\n",ra(i,l1),rb(i,l1));
if(ra(i,l1)==rb(i,r1) && ra(i,l2)==rb(i,l2))
ans+=max(0ll,l2-l1+1);
}
printf("%lld",ans);
return 0;
}