#include <bits/stdc++.h>
using ul = std::uint32_t;
using li = std::int32_t;
using ll = std::int64_t;
using ull = std::uint64_t;
using vul = std::vector<ul>;
using vvul = std::vector<vul>;
using pulul = std::pair<ul, ul>;
using llf = long double;
ul n;
class cas {
 public:
  ul mnx = 0;
  ul mxx = 0;
  ul mny = 0;
  ul mxy = 0;
  ul id = 0;
  cas() = default;
};
std::list<cas> stack[100000][4];
std::list<cas>::iterator pos[100001][4];
std::list<cas>::iterator itstack[100000][4];
bool search(ul depth, ul sp) {
  stack[depth][sp + 3 & 3] = stack[depth][sp + 2 & 3] =
      stack[depth][sp + 1 & 3] = stack[depth][sp];
  if (sp != 0)
    stack[depth][0].sort(
        [](const cas& a, const cas& b) { return a.mnx < b.mnx; });
  if (sp != 1)
    stack[depth][1].sort(
        [](const cas& a, const cas& b) { return a.mny < b.mny; });
  if (sp != 2)
    stack[depth][2].sort(
        [](const cas& a, const cas& b) { return a.mxx > b.mxx; });
  if (sp != 3)
    stack[depth][3].sort(
        [](const cas& a, const cas& b) { return a.mxy > b.mxy; });
  for (ul i = 0; i != 4; ++i) {
    for (auto it = stack[depth][i].begin(); it != stack[depth][i].end(); ++it) {
      pos[it->id][i] = it;
    }
  }
  while (true) {
    if (stack[depth][0].size() == 1) {
      return true;
    }
    for (ul i = 0; i != 4; ++i) {
      itstack[depth][i] = stack[depth][i].begin();
    }
    ul mxx = itstack[depth][0]->mxx, mxy = itstack[depth][1]->mxy,
       mnx = itstack[depth][2]->mnx, mny = itstack[depth][3]->mny;
    bool flag = false;
    while (!flag && itstack[depth][0] != stack[depth][0].end()) {
      ul sp = 0;
      if (!flag && itstack[depth][0]->mnx >= mxx) {
        flag = true;
        sp = 0;
      }
      if (!flag && itstack[depth][1]->mny >= mxy) {
        flag = true;
        sp = 1;
      }
      if (!flag && itstack[depth][2]->mxx <= mnx) {
        flag = true;
        sp = 2;
      }
      if (!flag && itstack[depth][3]->mxy <= mny) {
        flag = true;
        sp = 3;
      }
      if (!flag) {
        mxx = std::max(mxx, itstack[depth][0]->mxx);
        mxy = std::max(mxy, itstack[depth][1]->mxy);
        mnx = std::min(mnx, itstack[depth][2]->mnx);
        mny = std::min(mny, itstack[depth][3]->mny);
      }
      if (flag) {
        stack[depth + 1][sp].clear();
        for (auto it = stack[depth][sp].begin(); it != itstack[depth][sp];) {
          stack[depth + 1][sp].push_back(*it);
          auto nex = std::next(it);
          ul id = it->id;
          for (ul i = 0; i != 4; ++i) {
            stack[depth][i].erase(pos[id][i]);
          }
          it = nex;
        }
        if (!search(depth + 1, sp)) {
          return false;
        }
      }
      if (!flag) {
        for (ul i = 0; i != 4; ++i) {
          ++itstack[depth][i];
        }
      }
    }
    if (!flag) {
      return false;
    }
  }
}
int main() {
  std::scanf("%u", &n);
  for (ul i = 1; i <= n; ++i) {
    stack[0][0].push_back(cas());
    stack[0][0].back().id = i;
    std::scanf("%u%u%u%u", &stack[0][0].back().mnx, &stack[0][0].back().mny,
               &stack[0][0].back().mxx, &stack[0][0].back().mxy);
  }
  stack[0][0].sort([](const cas& a, const cas& b) { return a.mnx < b.mnx; });
  std::printf(search(0, 0) ? "YES\n" : "NO\n");
  return 0;
}
