#include <bits/stdc++.h>
using namespace std;
const int P = 1e9 + 7, INF = 0x3f3f3f3f;
long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
long long qpow(long long a, long long n) {
  long long r = 1 % P;
  for (a %= P; n; a = a * a % P, n >>= 1)
    if (n & 1) r = r * a % P;
  return r;
}
long long inv(long long first) {
  return first <= 1 ? 1 : inv(P % first) * (P - P / first) % P;
}
inline int rd() {
  int first = 0;
  char p = getchar();
  while (p < '0' || p > '9') p = getchar();
  while (p >= '0' && p <= '9') first = first * 10 + p - '0', p = getchar();
  return first;
}
const int N = 1e6 + 10;
struct _ {
  int l, r, id;
  bool operator<(const _ &rhs) const {
    if (l == rhs.l) return id < rhs.id;
    return l < rhs.l;
  }
} a[N][4];
set<_> s[4];
int dfs(set<_> L[4]) {
  if (L[0].size() <= 1) return 1;
  set<_> R[4];
  set<_>::iterator it[4];
  int m[4];
  for (int i = 0; i <= 3; ++i) {
    it[i] = L[i].begin();
    m[i] = it[i]++->r;
  }
  int sz = L[0].size();
  for (int i = 1; i <= sz - 1; ++i)
    for (int j = 0; j <= 3; ++j) {
      if (it[j]->l >= m[j]) {
        for (auto t = L[j].begin(); t != it[j];) {
          int id = t++->id;
          for (int k = 0; k <= 3; ++k)
            R[k].insert(a[id][k]), L[k].erase(a[id][k]);
        }
        return dfs(L) && dfs(R);
      }
      m[j] = max(m[j], it[j]++->r);
    }
  return 0;
}
int main() {
  int n = rd();
  for (int i = 1; i <= n; ++i) {
    int x1 = rd(), y1 = rd(), x2 = rd(), y2 = rd();
    a[i][0] = {x1, x2, i};
    a[i][1] = {-x2, -x1, i};
    a[i][2] = {y1, y2, i};
    a[i][3] = {-y2, -y1, i};
    for (int j = 0; j <= 3; ++j) s[j].insert(a[i][j]);
  }
  cout << (dfs(s) ? "YES" : "NO") << '\n';
}
