#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (int)(n); ++i)
#define debug(x) cerr << #x << " = " << x << "\n"
#define debugv(x) rep(i, x.size()) cerr << x[i] << (i == x.size() - 1 ? "\n" : " ")
using namespace std;
//#define int long long
typedef long long ll;
typedef pair<int, int> pii;
const int INF = ((1LL << 30) + (1LL << 29));
const int MOD = 1000000007;

//=============================
int N, M, K;
int L, H;
vector<int> A;
string S, T;
vector<pii> reds;
vector<pii> blues;
struct Point{
    int x;
    int y;
    int c;
};
vector<Point> points;
//=============================
void input()
{
    cin >> N;
    reds.resize(N);
    blues.resize(N);
    points.resize(2*N);
    rep(i, N)
    {
        cin >> reds[i].first >> reds[i].second;
        points[i].x = reds[i].first;
        points[i].y = reds[i].second;
        points[i].c = 0;
    }
    rep(i, N)
    {
        cin >> blues[i].first >> blues[i].second;
        points[i+N].x = blues[i].first;
        points[i+N].y = blues[i].second;
        points[i+N].c = 1;
        
    }
}
//=============================
void func() {}
//=============================
void solve()
{
    // for(auto a : points){
    //     printf("%d, %d, %d\n", a.x, a.y, a.c);
    // }
    // debug("a");
    sort(reds.begin(), reds.end());
    sort(blues.begin(), blues.end());
    sort(points.begin(),points.end(), 
    [](const Point &a, const Point &b) {
        return (a.x < b.x ?  (a.y < b.y ? a.c < b.c : 0) : 0);
    });


    sort(reds.begin(),reds.end(), [](const pii &a, const pii &b){
        return a.second>b.second;
    });

    set <int> rr;
    int ans=0;
    for (auto b : blues) {
        for (auto r : reds){
            if (rr.find(r.second)==rr.end() && b.first>r.first && b.second>r.second){
                ans++;
                rr.insert(r.second);
                break;
            }
        }

    }
    cout<<ans<<endl;



    // for(auto a : points){
    //     printf("%d, %d, %d\n", a.x, a.y, a.c);
    // }

//     int ans = 0;
//     set<int> used;
//     map<int,int> mm;
//     vector<vector<int>> vv(N);
//     rep(i, N)
//     {
//         int cnt = 0;
//         rep(j, N)
//         {
//             // // cout<<reds[i].first<<endl;
//             // if (used.find(j) != used.end())
//             // {
//             //     //    debug(j);
//             //     continue;
//             // }

//             if (reds[i].first < blues[j].first && reds[i].second < blues[j].second)
//             {
//                 //   debug(ans);
//              //   used.insert(j);
//                 cnt++;
//                 mm[j]++;
//                 vv[i].push_back(j);
//             }
//         }


//     }

// //     for (auto x: mm){

// //         printf("%d : %d\n",x.first,x.second);
// //     }


// // // debug("here");
// // //     for (auto xx : vv){
// // //         debugv(xx);
// // //     }

//     set<int> taken;

    
//     sort(vv.begin(),vv.end(),[](const vector<int> &a, const vector<int> &b){
//         return a.size() < b.size();
//     });

    
// // debug("here");
// //     for (auto xx : vv){
// //         debugv(xx);
// //     }


//     for (int i = 0; i < vv.size(); ++i){
//         for (auto x : vv[i]){
//             if (taken.find(x) == taken.end()){
//                 taken.insert(x);
//                 ans++;
//             }
//         }
//     }
//     cout<<ans<<endl;



    
    



    //cout << ans << endl;
}
//=============================
signed main()
{
    input();
    solve();
    return 0;
}

Measured memory_bytes: 256