Problem:
Score : 400 points

Problem Statement

On a two-dimensional plane, there are N red points and N blue points.
The coordinates of the i-th red point are (a_i, b_i), and the coordinates of the i-th blue point are (c_i, d_i).

A red point and a blue point can form a friendly pair when, the x-coordinate of the red point is smaller than that of the blue point, and the y-coordinate of the red point is also smaller than that of the blue point.

At most how many friendly pairs can you form? Note that a point cannot belong to multiple pairs.

Constraints

All input values are integers.

1 \leq N \leq 100

0 \leq a_i, b_i, c_i, d_i < 2N

a_1, a_2, ..., a_N, c_1, c_2, ..., c_N are all different.

b_1, b_2, ..., b_N, d_1, d_2, ..., d_N are all different.

Input

Input is given from Standard Input in the following format:

N
a_1 b_1
a_2 b_2
:
a_N b_N
c_1 d_1
c_2 d_2
:
c_N d_N

Output

Print the maximum number of friendly pairs.

Sample Input 1

3
2 0
3 1
1 3
4 2
0 4
5 5

Sample Output 1

2

For example, you can pair (2, 0) and (4, 2), then (3, 1) and (5, 5).

Sample Input 2

3
0 0
1 1
5 2
2 3
3 4
4 5

Sample Output 2

2

For example, you can pair (0, 0) and (2, 3), then (1, 1) and (3, 4).

Sample Input 3

2
2 2
3 3
0 0
1 1

Sample Output 3

0

It is possible that no pair can be formed.

Sample Input 4

5
0 0
7 3
2 2
4 8
1 6
8 5
6 9
5 4
9 1
3 7

Sample Output 4

5

Sample Input 5

5
0 0
1 1
5 5
6 6
7 7
2 2
3 3
4 4
8 8
9 9

Sample Output 5

4

Solution in Rust (1.15.1) (judge verdict: Runtime Error)

extern crate core;

use std::io::{self, Read};

fn main() {
    let mut input = String::new();
    io::stdin().read_to_string(&mut input).unwrap();
    let output = run(input.trim().to_string());
    println!("{}", output);
}

fn run(input: String) -> String {
    let n = input
        .split_whitespace()
        .nth(0)
        .unwrap()
        .parse::<usize>()
        .unwrap();

    let list = input
        .split("\n")
        .map(|x| {
            let v = x.split_whitespace()
                .map(|x| x.parse::<i64>().unwrap())
                .collect::<Vec<_>>();
            (v[0], v[1])
        })
        .collect::<Vec<_>>();

    let reds = list.clone()
        .into_iter()
        .take(n)
        .enumerate()
        .collect::<Vec<_>>();
    let blues = list.clone()
        .into_iter()
        .skip(n)
        .enumerate()
        .collect::<Vec<_>>();
    let mut red_pairs = Vec::new();
    let mut blue_pairs = Vec::new();
    for _ in 0..n {
        red_pairs.push(Vec::new());
        blue_pairs.push(Vec::new());
    }
    //全ペアの個数
    let mut all_count = 0;
    for &(i, (a, b)) in &reds {
        for &(j, (c, d)) in &blues {
            if a < c && b < d {
                red_pairs[i].push(j);
                blue_pairs[j].push(i);
                all_count += 1;
            }
        }
    }

    let mut output = 0;

    while all_count != 0 {
        //rでペアになれる最小数(ただし0ではない)
        let r_min = red_pairs
            .clone()
            .into_iter()
            .map(|x| x.len())
            .filter(|&x| x != 0)
            .min()
            .unwrap();

        //(r,bのペアリスト)
        let r_min_list = red_pairs
            .clone()
            .into_iter()
            .enumerate()
            .filter(|&(i, ref x)| x.len() == r_min)
            .collect::<Vec<_>>();

        // ペア
        let (min_r, min_b, _) = r_min_list
            .into_iter()
            .map(|(i, bs)| {
                bs.clone()
                .into_iter()
                //(赤,青,個数)
                .map(|x| (i,x, blue_pairs[x].len()))
                .filter(|&(_,_,x)|x!=0)
                .min_by_key(|&(_,_,x)| x)
                .unwrap()
            })
            .min_by_key(|&(_, _, x)| x)
            .unwrap();

        output += 1;

        // 削除
        all_count -= red_pairs[min_r].len();
        all_count -= blue_pairs[min_b].len();

        red_pairs[min_r] = Vec::new();
        blue_pairs[min_b] = Vec::new();

        /*for vec in &blue_pairs{
            for x in 
        }*/
    }
    output.to_string()
}

macro_rules! tests {
    ($($name:ident: $input:expr=>$output:expr,)*) => {
        mod tests {
            $(
                #[test]
                fn $name() {
                    assert_eq!(super::run($input.to_string()), $output.to_string());
                }
            )*
        }
    }
}

tests! {
    test1: "3 9" => "12",
    test2: "31 32" => "63",
    test3: "1 2" => "3",
    test4: "-1 2" => "1",
    test5: "10 1" => "11",
}