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 C (GCC 5.4.1) (judge verdict: Time Limit Exceeded)

//O(N^2)
#include <stdio.h>
#include <x86intrin.h>
typedef unsigned int uint;
#pragma GCC optimize ("O3")
uint read(void){
    int flag = 0;
    uint num = 0;
    for(;;){
        int c = getchar_unlocked() - '0';
        if(0 <= c && c <= 9){
            num = num*10+c;
            flag = 1;
        }else if(flag){
            return num;
        }
    }
}
#define B 1024
#define N (((200000+B-1)/B)*B)
uint a[N] __attribute__ ((aligned (16)));
uint b[N] __attribute__ ((aligned (16)));
#pragma GCC optimize ("Ofast")
#pragma GCC target ("avx")
int main(void){
    uint ss[4];
    uint s=0;
    uint n;
    n = read();
    for(uint i=0; i<n; i++){
        uint t = read();
        s ^= t;
        a[i] = t;
    }
    for(uint i=0; i<n; i++){
        uint t = read();
        s ^= t;
        b[i] = t;
    }
    if((n&1)==0){
        s = 0;
    }
    __m128i s0 = _mm_setzero_si128();
    __m128i s1 = _mm_setzero_si128();
    __m128i s2 = _mm_setzero_si128();
    __m128i s3 = _mm_setzero_si128();
    for(uint j=0; j<N; j+=B){
        for(uint i=0; i<N; i+=B){
            for(uint jj=0; jj<B; jj+=4){
                __m128i d = _mm_load_si128((__m128i*)(b+jj));
                __m128i d0 = _mm_shuffle_epi32(d, 0x00);
                __m128i d1 = _mm_shuffle_epi32(d, 0x55);
                __m128i d2 = _mm_shuffle_epi32(d, 0xAA);
                __m128i d3 = _mm_shuffle_epi32(d, 0xFF);
                for(uint ii=0; ii<B; ii+=16){
                    __m128i c0 = _mm_load_si128((__m128i*)(a+ii+0));
                    __m128i c1 = _mm_load_si128((__m128i*)(a+ii+4));
                    __m128i c2 = _mm_load_si128((__m128i*)(a+ii+8));
                    __m128i c3 = _mm_load_si128((__m128i*)(a+ii+12));
                    __m128i t0 = _mm_add_epi32(c0, d0);
                    __m128i t1 = _mm_add_epi32(c1, d0);
                    __m128i t2 = _mm_add_epi32(c2, d0);
                    __m128i t3 = _mm_add_epi32(c3, d0);
                    s0 = _mm_xor_si128(s0, t0);
                    s1 = _mm_xor_si128(s1, t1);
                    s2 = _mm_xor_si128(s2, t2);
                    s3 = _mm_xor_si128(s3, t3);
                    t0 = _mm_add_epi32(c0, d1);
                    t1 = _mm_add_epi32(c1, d1);
                    t2 = _mm_add_epi32(c2, d1);
                    t3 = _mm_add_epi32(c3, d1);
                    s0 = _mm_xor_si128(s0, t0);
                    s1 = _mm_xor_si128(s1, t1);
                    s2 = _mm_xor_si128(s2, t2);
                    s3 = _mm_xor_si128(s3, t3);
                    t0 = _mm_add_epi32(c0, d2);
                    t1 = _mm_add_epi32(c1, d2);
                    t2 = _mm_add_epi32(c2, d2);
                    t3 = _mm_add_epi32(c3, d2);
                    s0 = _mm_xor_si128(s0, t0);
                    s1 = _mm_xor_si128(s1, t1);
                    s2 = _mm_xor_si128(s2, t2);
                    s3 = _mm_xor_si128(s3, t3);
                    t0 = _mm_add_epi32(c0, d3);
                    t1 = _mm_add_epi32(c1, d3);
                    t2 = _mm_add_epi32(c2, d3);
                    t3 = _mm_add_epi32(c3, d3);
                    s0 = _mm_xor_si128(s0, t0);
                    s1 = _mm_xor_si128(s1, t1);
                    s2 = _mm_xor_si128(s2, t2);
                    s3 = _mm_xor_si128(s3, t3);
                }
            }
        }
    }
    s0 = _mm_xor_si128(s0, s2);
    s1 = _mm_xor_si128(s1, s3);
    s0 = _mm_xor_si128(s0, s1);
    _mm_storeu_si128((__m128i*)ss, s0);
    ss[0] ^= ss[2];
    ss[1] ^= ss[3];
    ss[0] ^= ss[1];
    printf("%u\n", ss[0]^s);
    return 0;
}