#include <iostream>
#include <algorithm>
#include <vector>
#define rep(i, n) for(i = 0; i < n; i++)
using namespace std;

//この中では、互いにガチプレイ！
int simurate(vector<int> &F, vector<int> &P) {
    int i, j;
    
    j = 0;
    for (i = 0; i < P.size(); i++) {
        for (; j < F.size(); j++) {
            if (F[j] > P[i]) { break; }
        }
        if (j == F.size()) { break; }
        //F[j]とP[i]を割り当てる
        j++;
    }
    
    //この時点でのiが勝った回数に相当する
    return i;
}

int n;
int p[5000];
int f[5000];

int main() {
    int i, j;
    
    cin >> n;
    rep(i, n) cin >> p[i];
    rep(i, n) cin >> f[i];
    
    vector<int> ans;    //答え（辞書順最大）
    
    vector<int> F;  //女の現在の手札
    rep(i, n) { F.push_back(f[i]); }
    sort(F.begin(), F.end());
    
    rep(i, n) {//p[i]に割り当てるカードを決める
        int index = upper_bound(F.begin(), F.end(), p[i]) - F.begin();
        //F[index]～F[F.size() - 1]はp[i]より強い
        if (index == F.size()) { //どうやっても無理
            index = 0;    //舐めプを考えなければ、最弱を渡せばよい
        }
        
        //とりあえず, p[i]にはF[index]を当てれば勝てるんですが、
        //どのくらい舐めプできますか？
        vector<int> F2;
        for (j = 0; j < F.size(); j++) {
            if (j == index) continue;
            F2.push_back(F[j]);
        }
        vector<int> P;    //男の持ってるカード
        for (j = i + 1; j < n; j++) { P.push_back(p[j]); }
        sort(P.begin(), P.end());
        
        //男カード:P, 女カード:F2のとき、女が何勝できる？(最適解)
        int maxWinCnt = simurate(F2, P);
        
        //じゃあ舐めてかかろう！
        int left = index, right = F.size(), mid;   //[left, right),
                                            //F:ooooxxxx
        while (right - left >= 2) {
            mid = (left + right) / 2;
            
            //p[i]にF[mid]を割り当ててもいいですか？
            vector<int> F3;
            for (j = 0; j < F.size(); j++) {
                if (j == mid) { continue; }
                F3.push_back(F[j]);
            }
            int winCnt = simurate(F3, P);
            
            if (winCnt == maxWinCnt) {
                left = mid;
            }
            else {
                right = mid;
            }
        }
        //F[left]を割り当てまーす！
        ans.push_back(F[left]);
        
        //女のカードがなくなっちゃう～
        vector<int> F4;
        for (j = 0; j < F.size(); j++) {
            if (j == left) { continue; }
            F4.push_back(F[j]);
        }
        
        //コピー(値のコピー)
        F = F4;
    }
    
    rep(i, ans.size()) {
        cout << ans[i];
        if (i + 1 < ans.size()) { cout << " "; }
    }
    cout << endl;
    return 0;
}
