#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;

const int MAXN = 1 << 17;

int n;
int a[MAXN] , b[MAXN] , c[MAXN];
vector < pair < int , int > > ans;

void read() {
	int i , x;
	
	scanf ( "%d" , &n );
	for (i = 1; i <= n; i++) {
		scanf ( "%d" , &x );
		b[x] = i;
	}
	
	for (i = 1; i <= n; i++) {
		scanf ( "%d" , &c[i] );
		a[ b[ c[i] ] ] = i;
	}
}

vector < int > go ( int l , int r ) {
// 	printf ("%d %d\n" , l , r );
	if ( l == r ) {
		return vector < int > ( 1 , a[l] );
	}
	
	int dir1 , dir2;
	int s[2] , d[2];
	int mid = (l + r) / 2;
	int i = l , j;
	vector < int > q , w , bau;
	
	q = go ( l , mid );
	w = go ( mid + 1 , r );
	
	s[0] = d[0] = 0;
	s[1] = (int)q.size() - 1;
	d[1] = (int)w.size() - 1;
	dir1 = dir2 = 0;
	
	while ( s[0] <= s[1] && d[0] <= d[1] ) {
		if ( q[ s[dir1] ] < w[ d[dir2] ] ) {
			if ( dir1 == 1 ) {
				ans.push_back ( make_pair ( i , l + s[dir1] ) );
				++ s[0];
				dir1 ^= 1;
			} else
				++ s[0];
		} else {
			ans.push_back ( make_pair ( i , l + (int)q.size() + d[0] ) );
			++ d[0];
			dir1 ^= 1;
		} 
		
		++ i;
	}
	
	bau.reserve ( (int)q.size() + (int)w.size() );
	
	for (i = j = 0; i < (int)q.size() || j < (int)w.size(); ) {
		if ( i == (int)q.size() )
			bau.push_back ( w[j ++] );
		else
			if ( j == (int)w.size() )
				bau.push_back ( q[i ++] );
			else {
				if ( q[i] < w[j] )
					bau.push_back ( q[i ++] );
				else
					bau.push_back ( w[j ++] );
			}
	}
	
	return bau;
}

void solve() {
	int i;
	int l , r;
	
	for (i = 0; i < 5; i++) {
		l = 1 + (rand() % n);
		r = 1 + (rand() % n);
		
		if ( l > r ) swap ( l , r );
		
		ans.push_back ( make_pair ( l , r ) );
		while ( l < r ) 
			swap ( a[l ++] , a[r --] );
	}
	
	go ( 1 , n );
	
	printf ( "%d\n" , (int)ans.size() );
	for (i = 0; i < (int)ans.size(); i++)
		printf ( "%d %d\n" , ans[i].first , ans[i].second );
}

int main() {
	read();
	solve();
	
	return 0;
}
