import core.bitop;
import std.algorithm;
import std.ascii;
import std.bigint;
import std.conv;
import std.functional;
import std.format;
import std.math;
import std.numeric;
import std.range;
import std.stdio;
import std.string;
import std.random;
import std.typecons;

alias sread = () => readln.chomp();
alias Point2 = Tuple!(long, "y", long, "x");

T lread(T = long)()
{
    return readln.chomp.to!T();
}

T[] aryread(T = long)()
{
    return readln.split.to!(T[])();
}

void scan(TList...)(ref TList Args)
{
    auto line = readln.split();
    foreach (i, T; TList)
    {
        T val = line[i].to!(T);
        Args[i] = val;
    }
}

enum MOD = (10 ^^ 9) + 7;

void main()
{
    long N = lread();
    long[] red_x = new long[](N);
    long[] red_y = new long[](N);
    long[] bluex = new long[](N);
    long[] bluey = new long[](N);
    foreach (i; 0 .. N)
    {
        long x, y;
        scan(x, y);
        red_x[i] = x;
        red_y[i] = y;
    }
    foreach (i; 0 .. N)
    {
        long x, y;
        scan(x, y);
        bluex[i] = x;
        bluey[i] = y;
    }
    zip(red_y, red_x).sort!"b<a"();
    zip(bluex, bluey).sort();
    // writeln(red_x);
    // writeln(red_y);
    // writeln(bluex);
    // writeln(bluey);
    long ans;
    auto used = new bool[](N);
    foreach (i; 0 .. N)
    {
        loop: foreach (j; 0 .. N)
            if (!used[j] && red_x[i] < bluex[j] && red_y[i] < bluey[j])
            {
                used[j] = true;
                ans++;
                break loop;
            }
    }
    writeln(ans);
}
