Problem:
Score : 500 points

Problem Statement

#nck {
width: 30px;
height: auto;
}

There are N computers and N sockets in a one-dimensional world.
The coordinate of the i-th computer is a_i, and the coordinate of the i-th socket is b_i.
It is guaranteed that these 2N coordinates are pairwise distinct.

Snuke wants to connect each computer to a socket using a cable.
Each socket can be connected to only one computer.

In how many ways can he minimize the total length of the cables?
Compute the answer modulo 10^9+7.

Constraints

1 ≤ N ≤ 10^5

0 ≤ a_i, b_i ≤ 10^9

The coordinates are integers.

The coordinates are pairwise distinct.

Input

The input is given from Standard Input in the following format:

N
a_1
:
a_N
b_1
:
b_N

Output

Print the number of ways to minimize the total length of the cables, modulo 10^9+7.

Sample Input 1

2
0
10
20
30

Sample Output 1

2

There are two optimal connections: 0-20, 10-30 and 0-30, 10-20.
In both connections the total length of the cables is 40.

Sample Input 2

3
3
10
8
7
12
5

Sample Output 2

1

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include<bits/stdc++.h>
#define X first
#define Y second
#define pb emplace_back
#define FOR(i,a,b) for(int (i)=(a);i<(b);++(i))
#define EFOR(i,a,b) for(int (i)=(a);i<=(b);++(i))
#define rep(X,Y) for (int (X) = 0;(X) < (Y);++(X))
#define REP rep
#define rrep(X,Y) for (int (X) = (Y)-1;(X) >=0;--(X))
#define all(X) (X).begin(),(X).end()
#define eb emplace_back

using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef ll LL;
typedef pii PII;
typedef pll PLL;
const ll MOD=1e9+7;

#define rall(X) (X).rbegin(),(X).rend()
#define UNIQUE(X) (X).erase(unique(all(X)),(X).end())
#define reps(X,S,Y) for (int (X) = S;(X) < (Y);++(X))
#define rreps(X,S,Y) for (int (X) = (Y)-1;(X) >= (S);--(X))
template<class T> inline bool MX(T &l,const T &r){return l<r?l=r,1:0;}
template<class T> inline bool MN(T &l,const T &r){return l>r?l=r,1:0;}

int N;
vector<int> A, B;

signed main(){
  ios_base::sync_with_stdio(false);
  cout<<fixed<<setprecision(0);
  
  cin >> N;
  A.resize(N);
  rep(i, N) {
    cin >> A[i];
  }
  sort(all(A));

  B.resize(N);
  rep(i, N) {
    cin >> B[i];
  }
  sort(all(B));
  if (A[0] > B[0]) A.swap(B);

  vector<pii> es;
  for (int a : A) {
    es.eb(pii(a, -1));
  }

  for (int b : B) {
    es.eb(pii(b, 1));
  }
  sort(all(es));

  int cnt = 0;
  LL ans = 1;
  int sgn = 1;
  for (pii &p : es) {
    int x = p.X;
    int d = p.Y;
    if (d == -1) {
      cnt++;
      if (cnt == 1) sgn = 1;
      if (sgn == 1) {
        ans *= abs(cnt);
        ans %= MOD;
      }
    } else if (d == 1) {
      cnt--;
      if (cnt == -1) sgn = -1;
      if (sgn == -1) {
        ans *= abs(cnt);
        ans %= MOD;
      }
    } else assert(0);
    //cout << x << ", " << d << ", " << cnt << " = " << ans << endl;
  }
  cout << ans << endl;
}