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 5.4.1) (judge verdict: Wrong Answer)

#include<stdio.h>
int R=1,C=1,H[2000010],N[2000010];
//評価関数（いまはMIN）
int hyouka(int a,int b){
  if(C<b)return 1;
  if(C<a||b==0)return 0;
  return N[H[a]]<N[H[b]]?1:0;
}
//挿入関数
void hin(int a){
  int i=C++;
  for(N[H[0]=R]=a;hyouka(0,i/2);i/=2)H[i]=H[i/2];
  H[i]=R++;
}
//取り出す関数
int hout(){
  int rt=H[1],i,j=2,k=H[--C];
  for(i=1;hyouka(i,C);i=j)H[i]=H[j=i*2+1-hyouka(i*2,i*2+1)];
  H[j/2]=k;
  return rt;
}
int main(){
  int n,f=0,a[100010],b[100010],r[100010],d[100010],i,l=-1,e[100010];
  scanf("%d",&n);
  for(i=0;i<n;i++)scanf("%d",&a[i]);
  for(i=0;i<n;i++)scanf("%d",&b[i]);
  for(i=0;i<n;i++){
    d[i]=-1;
    if(a[i]<=b[i])d[i]=1;
  }
  for(i=0;i<n;i++)hin(a[i]);
  for(i=0;i<n;i++)r[i]=hout()-1;
  R=C=1;
  for(i=0;i<n;i++)hin(b[i]);
  for(i=0;i<n;i++)b[i]=N[hout()];
  for(i=0;i<n;i++){
    if(a[r[i]]>b[i]){
      printf("No\n");
      return 0;
    }
  }
  /*for(i=0;i<n;i++){
    if(a[r[i]]>b[i])d[i]=-1;
    else            d[i]=1;
    }//*/




  
  for(i=1;i<n;i++){
    //printf("%d %d\n",a[r[i-1]],b[i]);
    if(a[r[i]]<=b[i-1])e[i]=1;
    else               e[i]=-1;
  }
  //for(i=0;i<n;i++)printf("%d ",r[i]);printf("\n");
  //for(i=0;i<n;i++)printf("%d ",d[i]);printf("\n");
  //for(i=0;i<n;i++)printf("%d ",e[i]);printf("\n");
  /*
  for(i=0;i<n;i++){
    if(e[i]==0)continue;
    if(r[i]<i)continue;
    printf("!%d\n",i);
    }//*/

  
  for(i=n;i--;){
    if(e[i]==0)continue;
    if(l==-1)l=i;
    e[i]=l;
  }
  for(i=0;i<n;i++){
    if(d[i]==-1)continue;
    if(e[i]==-1)continue;
    if(e[i]>=r[i]){
      printf("Yes\n");
      return 0;
    }
  }
  printf("No\n");
  return 0;
}