传送门
#include
#include
#include
#include
#define maxn 200005
#define maxm 1000005
using namespace std;
int n,i,j,k,a[maxn],b[maxn],cnt,tot,fr[maxn];
int t0[maxm],t1[maxm],t[maxm],tmp[2][maxn];
struct arr{int x,i,tp;} A[maxn];
int cmp(arr a,arr b){return a.x<b.x;}
void read(int &x){
x=0; char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar());
for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
}
void upd(int x){
int ls=x<<1,rs=(x<<1)^1;;
int tmp=min(t0[ls],t1[rs]);
t[x]=t[ls]+t[rs]+tmp,t0[x]=t0[ls]+t0[rs]-tmp,t1[x]=t1[ls]+t1[rs]-tmp;
}
void maketree(int x,int l,int r){
if (l==r) {
t0[x]=tmp[0][l],t1[x]=tmp[1][l],t[x]=0;
return;
}
int mid=(l+r)>>1;
maketree(x<<1,l,mid),maketree((x<<1)^1,mid+1,r);
upd(x);
}
void del(int x,int l,int r,int p,int tp){
if (l==r) {
if (!tp) t0[x]--; else t1[x]--;
return;
}
int mid=(l+r)/2;
if (p<=mid) del(x<<1,l,mid,p,tp);
else del((x<<1)^1,mid+1,r,p,tp);
upd(x);
}
int find(int x,int l,int r,int tp,int d){
if (l==r) return l;
int mid=(l+r)/2,ls=x<<1,rs=(x<<1)^1;
int res=max(d-t1[ls],0)+t0[ls];
if (tp==1){
if (t[rs]||min(res,t1[rs])) return find(rs,mid+1,r,tp,res);
else return find(ls,l,mid,tp,d);
} else {
if (res<t1[rs]) return find(rs,mid+1,r,tp,res);
else return find(ls,l,mid,tp,d);
}
}
int main(){
// freopen("game.in","r",stdin);
// freopen("game.out","w",stdout);
read(n);
for(i=1;i<=n;i++) read(a[i]),A[i].x=a[i],A[i].i=i,A[i].tp=0;
for(i=1;i<=n;i++) read(b[i]),A[i+n].x=b[i],A[i+n].i=i,A[i+n].tp=1;
tot=n*2,sort(A+1,A+1+tot,cmp);
for(i=1;i<=tot;i++){
if (i==1||A[i].x!=A[i-1].x) cnt++,fr[cnt]=A[i].x;
if (A[i].tp==0) a[A[i].i]=cnt,tmp[0][cnt]++;
else b[A[i].i]=cnt,tmp[1][cnt]++;
}
maketree(1,0,cnt);
for(i=1;i<=n;i++){
int tmp=t[1];
del(1,0,cnt,a[i],0);
if (t[1]==tmp){
int ls0=find(1,0,cnt,1,0),ls1=find(1,0,cnt,2,0);
if (ls0<=a[i]) k=ls1; else k=ls0;
} else k=find(1,0,cnt,2,0);
printf("%d ",fr[k]);
del(1,0,cnt,k,1);
}
}