Problem:
Score : 600 points

Problem Statement

Given are two integer sequences of N elements each: A_1,...,A_N and B_1,...,B_N.
Determine if it is possible to do the following operation at most N-2 times (possibly zero) so that, for every integer i from 1 to N, A_i \leq B_i holds:

Choose two distinct integers x and y between 1 and N (inclusive), and swap the values of A_x and A_y.

Constraints

2 \leq N \leq 10^5

1 \leq A_i,B_i \leq 10^9

Input

Input is given from Standard Input in the following format:

N
A_1 A_2 ... A_N
B_1 B_2 ... B_N

Output

If the objective is achievable, print Yes; if it is not, print No.

Sample Input 1

3
1 3 2
1 2 3

Sample Output 1

Yes

We should swap the values of A_2 and A_3.

Sample Input 2

3
1 2 3
2 2 2

Sample Output 2

No

Sample Input 3

6
3 1 2 6 3 4
2 2 8 3 4 3

Sample Output 3

Yes

Solution in C++ (GCC 9.2.1) (judge verdict: Wrong Answer)

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define For(i,j,k) for(int i=(int)(j);i<=(int)(k);i++)
#define Rep(i,j,k) for(int i=(int)(j);i>=(int)(k);i--)
inline ll read(){
	ll x=0;char ch=getchar();bool f=0;
	for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=1;
	for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
	return f?-x:x;
}
void write(ll x){
	if(x<0) putchar('-'),x=-x;
	if(x>=10) write(x/10);putchar(x%10+'0');
}
void writeln(ll x){write(x);puts("");}
void writep(ll x){write(x);putchar(' ');}
const int N=1e5+5;
struct node{
	int id,val;
	bool operator <(const node &b) const{
		return val<b.val;
	}
}b[N];
int n,p[N],tot,tr[N];
void upt(int x){
	while(x<=n) tr[x]++,x+=(x&-x);
}
int query(int x){
	int res=0;
	while(x) res+=tr[x],x-=(x&-x);
	return res;
}
ll calc(int *a){
	memset(tr,0,sizeof(tr));
	ll ans=0;
	for(int i=1;i<=n;++i)
		b[i].id=i,b[i].val=a[i];
	sort(b+1,b+n+1);tot=1;
	p[b[1].id]=1;
	for(int i=2;i<=n;++i)
		if(b[i].val==b[i-1].val) p[b[i].id]=tot;
		else p[b[i].id]=++tot;
	for(int i=n;i>=1;--i){
		ans+=query(p[i]-1);
		upt(p[i]);
	}
	return ans;
}
int a[N],c[N];
int main(){
	n=read();
	for(int i=1;i<=n;++i)
		a[i]=read();
	long long A=calc(a);
	for(int i=1;i<=n;++i)
		c[i]=read();
	long long B=calc(c);
	sort(a+1,a+n+1);
	sort(c+1,c+n+1);
	for(int i=1;i<=n;++i)
		if(a[i]>c[i]) return puts("No"),0;
	if(abs(A-B)<=n-1) puts("Yes");
	else puts("No");
	return 0;
}