void main(){
  import std.stdio, std.string, std.conv, std.algorithm;

  int n; rd(n);
  import std.typecons;
  alias Point=Tuple!(int, "x", int, "y");
  auto u=new Point[](n), v=new Point[](n);
  foreach(i; 0..n) rd(u[i].x, u[i].y);
  foreach(i; 0..n) rd(v[i].x, v[i].y);

  sort!((l, r)=>(l.x==r.x ? l.y>r.y : l.x>r.x))(u);
  sort!((l, r)=>(l.x==r.x ? l.y>r.y : l.x>r.x))(v);
  auto covered=new bool[](n);
  int cnt=0;
  foreach(p; v){
    foreach(j; 0..n){
      if(covered[j]) continue;
      if(u[j].x<p.x && u[j].y<p.y){
        cnt++;
        covered[j]=true;       
        break;
      }
    }
  }

  writeln(cnt);
}

void rd(T...)(ref T x){
  import std.stdio, std.string, std.conv;
  auto l=readln.split;
  assert(l.length==x.length);
  foreach(i, ref e; x){
    e=l[i].to!(typeof(e));
  }
}
