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# (Mono 4.6.2.0) (judge verdict: Wrong Answer)

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using static System.Console;
using System.Runtime.CompilerServices;
using static MyUtil;

class MyUtil
{
    public static int[] ReadIntArray()
    {
	return ReadLine().Split().Select(x => int.Parse(x)).ToArray();
    }
}

class Bisect
{
    /* BisectRight(a, x) returns the index where to insert x in a sorted list a.
     * 
     * The return value i is such that for all j < i, a[j] <= x and
     * for all j >= i, a[j] > x.
     */
    public static
	int BisectRight<T>(T[] a, T x, int lo=0, int hi=-1) where T:IComparable
    {
	if (hi < 0)  hi = a.Length;
	while (lo < hi)
	{
	    int mid = (lo + hi) / 2;
	    if (x.CompareTo(a[mid]) < 0) { hi = mid; }
	    else { lo = mid + 1; }
	}
	return lo;
    }
								    
    /* BisectLeft(a, x) returns the index where to insert x in a sorted list a.
     * 
     * The return value i is such that for all j < i, a[j] < x and
     * for all j >= i, a[j] >= x.
     */
    public static
	int BisectLeft<T>(T[] a, T x, int lo=0, int hi=-1) where T:IComparable
    {
	if (hi < 0)  hi = a.Length;
	while (lo < hi)
	{
	    int mid = (lo + hi) / 2;
	    if (a[mid].CompareTo(x) < 0) { lo = mid + 1; }
	    else { hi = mid; }
	}
	return lo;
    }
}

class Program
{
    public static void Main()
    {
	int n = int.Parse(ReadLine());
	int[] a = ReadIntArray();
	int[] b = ReadIntArray();

	var p = new Tuple<int,int>[n];
	for (int i = 0; i < n; i++)
	    p[i] = Tuple.Create(b[i], a[i]);

	Array.Sort(p);
	Array.Sort(b);

	int ct = 0;
	for (int i = 0; i < n; i++)
	{
	    var t = p[i];
	    int bi = t.Item1, ai = t.Item2;

	    if (ai > bi)
	    {
		if (ct == n-2){ WriteLine("No"); return; }

		int k = Bisect.BisectLeft(b, ai);
		bool failed = true;
		for (int j = k; j < n; j++)
		{
		    t = p[j];
		    int bj = t.Item1, aj = t.Item2;
		    if (aj <= bi)
		    {
			p[i] = Tuple.Create(bi, aj);
			p[j] = Tuple.Create(bj, ai);
			failed = false;
			ct++;
			break;
		    }
		}
		if (failed){ WriteLine("No"); return; }
	    }
	}
	WriteLine("Yes");
    }
}