#include <bits/stdc++.h>
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std;
inline int read() {
  int f = 1, x = 0;
  char ch;
  do {
    ch = getchar();
    if (ch == '-') f = -1LL;
  } while (ch < '0' || ch > '9');
  do {
    x = x * 10 + ch - '0';
    ch = getchar();
  } while (ch >= '0' && ch <= '9');
  return f * x;
}
template <class T>
inline void chmax(T &a, T b) {
  if (a < b) a = b;
}
template <class T>
inline void chmin(T &a, T b) {
  if (a > b) a = b;
}
inline void swap(int &a, int &b) {
  int c = a;
  a = b;
  b = c;
}
using namespace std;
const int N = 4e5 + 10;
set<int> seg[N << 2];
int mx[N << 2], mn[N << 2];
struct node {
  int x1, y1, x2, y2;
} a[N];
inline void show(node a) { printf("%d %d %d %d\n", a.x1, a.y1, a.x2, a.y2); }
vector<int> ins[N], era[N];
int n, px[N << 1], py[N << 1], totx, toty, lenx, leny, ok[N];
inline void upd(int p) {
  int mxv, mxc, mnc;
  if (!seg[p].size()) {
    mxv = -1;
  } else {
    mxv = *(--seg[p].end());
  }
  mxc = std::max(mx[p << 1], mx[p << 1 | 1]);
  mnc = std::min(mn[p << 1], mn[p << 1 | 1]);
  if (mxv > mxc) {
    if (ok[mxv] || mxv < mnc) {
      mx[p] = -1;
    } else {
      mx[p] = mxv;
    }
  } else {
    mx[p] = mxc;
  }
  mn[p] = std::max(mxv, mnc);
}
inline void cover(int cur, int L, int R, int l, int r, int id, int fl) {
  if (l > r) return;
  if (l <= L && r >= R) {
    if (fl == 1) {
      seg[cur].insert(id);
    } else if (fl == -1) {
      seg[cur].erase(id);
    }
    upd(cur);
    return;
  }
  int mid = (L + R) >> 1;
  if (l <= mid) cover(cur << 1, L, mid, l, r, id, fl);
  if (r > mid) cover(cur << 1 | 1, mid + 1, R, l, r, id, fl);
  upd(cur);
}
inline void norx(int &x) {
  x = (int)(lower_bound(px + 1, px + lenx + 1, x) - px);
}
inline void nory(int &x) {
  x = (int)(lower_bound(py + 1, py + leny + 1, x) - py);
}
int main() {
  memset(mx, -1, sizeof(mx));
  n = read();
  for (int i = (1); i <= (n); ++i)
    a[i].x1 = read(), a[i].y1 = read(), a[i].x2 = read(), a[i].y2 = read();
  for (int i = (1); i <= (n); ++i) {
    px[++totx] = a[i].x1;
    px[++totx] = a[i].x2;
    py[++toty] = a[i].y1;
    py[++toty] = a[i].y2;
  }
  sort(px + 1, px + totx + 1);
  sort(py + 1, py + toty + 1);
  lenx = (int)(unique(px + 1, px + totx + 1) - px - 1);
  leny = (int)(unique(py + 1, py + toty + 1) - py - 1);
  for (int i = (1); i <= (n); ++i) {
    norx(a[i].x1);
    norx(a[i].x2);
    nory(a[i].y1);
    nory(a[i].y2);
  }
  for (int i = (1); i <= (n); ++i) {
    ins[a[i].x1].push_back(i);
    era[a[i].x2].push_back(i);
  }
  for (int t = (1); t <= (lenx); ++t) {
    for (auto cur : ins[t]) {
      cover(1, 1, leny, a[cur].y1, a[cur].y2 - 1, cur, 1);
    }
    for (auto cur : era[t]) {
      cover(1, 1, leny, a[cur].y1, a[cur].y2 - 1, cur, -1);
    }
    while (~mx[1]) {
      ok[mx[1]] = 1;
      cover(1, 1, leny, a[mx[1]].y1, a[mx[1]].y2 - 1, mx[1], 0);
    }
  }
  int ans = 1;
  for (int i = (1); i <= (n); ++i)
    if (ok[i]) ++ans;
  printf("%d\n", ans);
  return 0;
}
