#include <bits/stdc++.h>
using namespace std;
int a[100005], b[100005], c[100005], d[100005];
bool dfs(set<pair<int, int> > &left, set<pair<int, int> > &right,
         set<pair<int, int> > &up, set<pair<int, int> > &down) {
  set<pair<int, int> >::iterator its1, its2, its3, its4;
  int n = left.size();
  if (n <= 1) return 1;
  vector<pair<int, int> > left2, right2, up2, down2;
  set<pair<int, int> > left3, right3, up3, down3;
  its1 = left.begin(), its2 = right.begin(), its3 = up.begin(),
  its4 = down.begin();
  int mx1 = 0, mx2 = 1e9, mx3 = 0, mx4 = 1e9;
  for (int i = 1; i <= n; i++) {
    if (i > 1) {
      if (its1->first > mx1) {
        for (int i = 0; i < left2.size(); i++) {
          int j = left2[i].second;
          left.erase(pair<int, int>(a[j], j));
          right.erase(pair<int, int>(-c[j], j));
          up.erase(pair<int, int>(b[j], j));
          down.erase(pair<int, int>(-d[j], j));
          left3.insert(pair<int, int>(a[j], j));
          right3.insert(pair<int, int>(-c[j], j));
          up3.insert(pair<int, int>(b[j], j));
          down3.insert(pair<int, int>(-d[j], j));
        }
        return (dfs(left, right, up, down) & dfs(left3, right3, up3, down3));
      }
      if (-its2->first < mx2) {
        for (int i = 0; i < right2.size(); i++) {
          int j = right2[i].second;
          left.erase(pair<int, int>(a[j], j));
          right.erase(pair<int, int>(-c[j], j));
          up.erase(pair<int, int>(b[j], j));
          down.erase(pair<int, int>(-d[j], j));
          left3.insert(pair<int, int>(a[j], j));
          right3.insert(pair<int, int>(-c[j], j));
          up3.insert(pair<int, int>(b[j], j));
          down3.insert(pair<int, int>(-d[j], j));
        }
        return (dfs(left, right, up, down) & dfs(left3, right3, up3, down3));
      }
      if (its3->first > mx3) {
        for (int i = 0; i < up2.size(); i++) {
          int j = up2[i].second;
          left.erase(pair<int, int>(a[j], j));
          right.erase(pair<int, int>(-c[j], j));
          up.erase(pair<int, int>(b[j], j));
          down.erase(pair<int, int>(-d[j], j));
          left3.insert(pair<int, int>(a[j], j));
          right3.insert(pair<int, int>(-c[j], j));
          up3.insert(pair<int, int>(b[j], j));
          down3.insert(pair<int, int>(-d[j], j));
        }
        return (dfs(left, right, up, down) & dfs(left3, right3, up3, down3));
      }
      if (-its4->first < mx4) {
        for (int i = 0; i < down2.size(); i++) {
          int j = down2[i].second;
          left.erase(pair<int, int>(a[j], j));
          right.erase(pair<int, int>(-c[j], j));
          up.erase(pair<int, int>(b[j], j));
          down.erase(pair<int, int>(-d[j], j));
          left3.insert(pair<int, int>(a[j], j));
          right3.insert(pair<int, int>(-c[j], j));
          up3.insert(pair<int, int>(b[j], j));
          down3.insert(pair<int, int>(-d[j], j));
        }
        return (dfs(left, right, up, down) & dfs(left3, right3, up3, down3));
      }
    }
    mx1 = max(mx1, c[its1->second]);
    mx2 = min(mx2, a[its2->second]);
    mx3 = max(mx3, d[its3->second]);
    mx4 = min(mx4, b[its4->second]);
    left2.push_back(*its1);
    right2.push_back(*its2);
    up2.push_back(*its3);
    down2.push_back(*its4);
    its1++, its2++, its3++, its4++;
  }
  return 0;
}
int main() {
  int n;
  scanf("%d", &n);
  set<pair<int, int> > left, right, up, down;
  for (int i = 1; i <= n; i++) {
    scanf("%d%d%d%d", &a[i], &b[i], &c[i], &d[i]);
    a[i]++, b[i]++;
    left.insert(pair<int, int>(a[i], i));
    right.insert(pair<int, int>(-c[i], i));
    up.insert(pair<int, int>(b[i], i));
    down.insert(pair<int, int>(-d[i], i));
  }
  bool ok = dfs(left, right, up, down);
  if (ok)
    printf("YES\n");
  else
    printf("NO\n");
}
