#include <bits/stdc++.h>
using namespace std;
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  int n;
  cin >> n;
  vector<tuple<int, int, int, int> > s_v((size_t)n);
  for (int i = 0; i < n; i++) {
    cin >> get<0>(s_v[i]) >> get<1>(s_v[i]) >> get<2>(s_v[i]) >> get<3>(s_v[i]);
  }
  sort(s_v.begin(), s_v.end());
  function<bool(int, vector<tuple<int, int, int, int> >)> f =
      [&f](int k, vector<tuple<int, int, int, int> > v) {
        vector<tuple<int, int, int, int> > v_l = v, v_r = v, v_b = v, v_t = v;
        stable_sort(
            v_l.begin(), v_l.end(),
            [](tuple<int, int, int, int> a, tuple<int, int, int, int> b) {
              return get<0>(a) < get<0>(b);
            });
        stable_sort(
            v_r.begin(), v_r.end(),
            [](tuple<int, int, int, int> a, tuple<int, int, int, int> b) {
              return get<2>(a) > get<2>(b);
            });
        stable_sort(
            v_b.begin(), v_b.end(),
            [](tuple<int, int, int, int> a, tuple<int, int, int, int> b) {
              return get<1>(a) < get<1>(b);
            });
        stable_sort(
            v_t.begin(), v_t.end(),
            [](tuple<int, int, int, int> a, tuple<int, int, int, int> b) {
              return get<3>(a) > get<3>(b);
            });
        list<tuple<int, int, int, int> > l_l(v_l.begin(), v_l.end()),
            l_r(v_r.begin(), v_r.end()), l_b(v_b.begin(), v_b.end()),
            l_t(v_t.begin(), v_t.end());
        set<tuple<int, int, int, int> > removed;
        while (k > 1) {
          int m_l = (int)-2e9, m_r = (int)2e9, m_b = (int)-2e9, m_t = (int)2e9,
              i = 0;
          for (auto i_l = l_l.begin(), i_r = l_r.begin(), i_b = l_b.begin(),
                    i_t = l_t.begin();
               i < k; i++, i_l++, i_r++, i_b++, i_t++) {
            while (removed.find(*i_l) != removed.end()) {
              i_l = l_r.erase(i_l);
            }
            while (removed.find(*i_r) != removed.end()) {
              i_r = l_r.erase(i_r);
            }
            while (removed.find(*i_b) != removed.end()) {
              i_b = l_b.erase(i_b);
            }
            while (removed.find(*i_t) != removed.end()) {
              i_t = l_t.erase(i_t);
            }
            if (i > 0) {
              if (m_l <= get<0>(*i_l) &&
                  (i == k - 1 || max(m_l, get<2>(*i_l)) != m_l)) {
                vector<tuple<int, int, int, int> > n_v(l_l.begin(), i_l);
                if (!f(i, n_v)) {
                  return false;
                }
                removed.insert(n_v.begin(), n_v.end());
                k -= i;
                break;
              }
              if (m_r >= get<2>(*i_r) &&
                  (i == k - 1 || min(m_r, get<0>(*i_r)) != m_r)) {
                vector<tuple<int, int, int, int> > n_v(l_r.begin(), i_r);
                if (!f(i, n_v)) {
                  return false;
                }
                removed.insert(n_v.begin(), n_v.end());
                k -= i;
                break;
              }
              if (m_b <= get<1>(*i_b) &&
                  (i == k - 1 || max(m_b, get<3>(*i_b)) != m_b)) {
                vector<tuple<int, int, int, int> > n_v(l_b.begin(), i_b);
                if (!f(i, n_v)) {
                  return false;
                }
                removed.insert(n_v.begin(), n_v.end());
                k -= i;
                break;
              }
              if (m_t >= get<3>(*i_t) &&
                  (i == k - 1 || min(m_t, get<1>(*i_t)) != m_t)) {
                vector<tuple<int, int, int, int> > n_v(l_t.begin(), i_t);
                if (!f(i, n_v)) {
                  return false;
                }
                removed.insert(n_v.begin(), n_v.end());
                k -= i;
                break;
              }
            }
            if (i == k - 1) {
              return false;
            }
            m_l = max(m_l, get<2>(*i_l)), m_r = min(m_r, get<0>(*i_r)),
            m_b = max(m_b, get<3>(*i_b)), m_t = min(m_t, get<1>(*i_t));
          }
        }
        return true;
      };
  cout << (f(n, s_v) ? "YES" : "NO") << endl;
  return 0;
}
