#include<bits/stdc++.h>
#define Maxn 100005
using namespace std;
int a[Maxn],b[Maxn];
int f[Maxn][2],l[Maxn],r[Maxn];
int st[Maxn],top;
struct Tree {
int val[Maxn<<2];
#define lson x<<1,l,mid
#define rson x<<1|1,mid+1,r
void merge(int x,int l,int r,int u,int w) {
if(l == r)return val[x]=max(val[x],w),void();
int mid=l+r>>1;
if(u<=mid) merge(lson,u,w);
else merge(rson,u,w);
val[x]=max(val[x<<1],val[x<<1|1]);
}
int query(int x,int l,int r,int L,int R) {
if(L<=l&&r<=R)return val[x];
int mid=l+r>>1,ans=0;
if(L<=mid)ans=max(ans,query(lson,L,R));
if(mid<R)ans=max(ans,query(rson,L,R));
val[x]=max(val[x<<1],val[x<<1|1]);
return ans;
}
} tr[2];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,tot = 0;
cin>>n; a[0]=INT_MAX;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int j=1;j<=n;j++)
cin>>b[j];
for(int j=1;j<=n;j++)
if(a[j]==b[j])
l[j]=r[j]=j;
for(int i=1;i<=n;i++) {
while(a[st[top]] < a[i]&&top) {if(!r[st[top]])r[st[top]] = i;top--;}
if(!l[i]&&top)l[i] = st[top];
while(a[st[top]] == a[i]&&top){if(!r[st[top]])r[st[top]] = i;top--;}
st[++top] = i;
}
for(int i=1;i<=n;i++) {
if(a[l[i]] != b[i])l[i] = 0;
if(a[r[i]] != b[i])r[i] = n+1;
}
for(int i=1;i<=n;i++) {
int L = i,R = i;
while(L>0&&a[L]<=b[i]&&a[L]!=b[i])L --;
while(R<=n&&a[R]<=b[i]&&a[R]!=b[i])R ++;
if(a[L] == b[i])l[i] = L;else l[i] = 0;
if(a[R] == b[i])r[i] = R;else r[i] = n+1;
}
for(int i=1;i<=n;i++) {
if(l[i] != 0)
f[i][0]=max({f[i][0],tr[0].query(1,1,n,1,l[i])+1,tr[1].query(1,1,n,1,l[i])+1});
if(r[i] != n+1)
f[i][1]=max({f[i][1],tr[0].query(1,1,n,1,n)+1,tr[1].query(1,1,n,1,r[i])+1});
tr[0].merge(1,1,n,l[i],f[i][0]);
tr[1].merge(1,1,n,r[i],f[i][1]);
} int maxn = 0;
for(int i=1;i<=n;i++)
maxn=max({maxn,f[i][0],f[i][1]});
cout << maxn;
return 0;
}