#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
const int N = 110;
const int V = 4 * N;
const int E = 2e5 + 10;
struct Graph
{
    struct Edge
    {
        int to, next;
    } e[E];
    int head[V], idx;
    inline void add(int u, int v)
    {
        e[++idx] = {v, head[u]};
        head[u] = idx;
    }
} g;
ll n;
struct Point
{
    ll x1, y1, id1;
    ll x2, y2, id2;
} a[N];
ll idx;
vector<ll> vec[N][N];
stack<int> s;
int timer, dfn[V], low[V], in[V];
int ble[V], scc;
inline void Tarjan(int u)
{
    dfn[u] = low[u] = ++timer;
    s.push(u), in[u] = 1;
    for (int i = g.head[u]; i; i = g.e[i].next)
    {
        int v = g.e[i].to;
        if (!dfn[v])
        {
            Tarjan(v);
            low[u] = min(low[u], low[v]);
        }
        else if (in[v])
            low[u] = min(low[u], dfn[v]);
    }
    if (dfn[u] == low[u])
    {
        int t;
        ++scc;
        do
        {
            t = s.top();
            s.pop();
            ble[t] = scc;
            in[t] = 0;
        } while (t != u);
    }
}
inline void clean()
{
    idx = g.idx = 0;
    for (int i = 1; i <= 4 * n; i++)
        g.head[i] = 0;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            vec[i][j].clear();
    timer = scc = 0;
    for (int i = 1; i <= 4 * n; i++)
        dfn[i] = low[i] = in[i] = ble[i] = 0;
}
inline void solve()
{
    clean();
    cin >> n;
    for (ll i = 1; i <= n; i++)
    {
        cin >> a[i].x1 >> a[i].y1 >> a[i].x2 >> a[i].y2;
        a[i].id1 = ++idx, a[i].id2 = ++idx;
        vec[a[i].x1][a[i].y1].push_back(a[i].id1);
        vec[a[i].x2][a[i].y2].push_back(a[i].id2);
    }
    for (ll i = 1; i <= 100; i++)
        for (ll j = 1; j <= 100; j++)
            if (vec[i][j].size() > 4)
            {
                cout << "NO" << endl;
                return;
            }
    for (ll i = 1; i <= n; i++)
    {
        g.add(a[i].id1, a[i].id2 + 2 * n);
        g.add(a[i].id2 + 2 * n, a[i].id1);
        g.add(a[i].id2, a[i].id1 + 2 * n);
        g.add(a[i].id1 + 2 * n, a[i].id2);
    }
    for (ll i = 1; i <= 100; i++)
        for (ll j = 1; j <= 100; j++)
            for (auto id1 : vec[i][j])
                for (auto id2 : vec[i][j])
                    if (id1 != id2)
                        g.add(id1 + 2 * n, id2);
    for (int i = 1; i <= 4 * n; i++)
        if (!dfn[i])
            Tarjan(i);
    for (ll i = 1; i <= 2 * n; i++)
        if (ble[i] == ble[i + 2 * n])
        {
            cout << "NO" << endl;
            return;
        }
    cout << "YES" << endl;
}
int main(int argc, char const *argv[])
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);
    ll T = 1;
    while (T--)
        solve();
    return 0;
}