Arkady has got an infinite plane painted in color 0. Then he draws n rectangles filled with paint with sides parallel to the Cartesian coordinate axes, one after another. The color of the i-th rectangle is i (rectangles are enumerated from 1 to n in the order he draws them). It is possible that new rectangles cover some of the previous ones completely or partially.

Count the number of different colors on the plane after Arkady draws all the rectangles.

Input

The first line contains a single integer n (1 ≤ n ≤ 100 000) — the number of rectangles.

The i-th of the next n lines contains 4 integers x_1, y_1, x_2 and y_2 (-10^9 ≤ x_1 < x_2 ≤ 10^9, -10^9 ≤ y_1 < y_2 ≤ 10^9) — the coordinates of corners of the i-th rectangle.

Output

In the single line print the number of different colors in the plane, including color 0.

Examples

Input

5
-1 -1 1 1
-4 0 0 4
0 0 4 4
-4 -4 0 0
0 -4 4 0


Output

5

Input

4
0 0 4 4
-4 -4 0 0
0 -4 4 0
-2 -4 2 4


Output

5

Note

<image> That's how the plane looks in the first sample

<image> That's how the plane looks in the second sample

0 = white, 1 = cyan, 2 = blue, 3 = purple, 4 = yellow, 5 = red. 
#include <bits/stdc++.h>
using namespace std;
const int MOD = (int)1e9 + 7;
const int FFTMOD = 1007681537;
const int INF = (int)1e9;
const long long LINF = (long long)1e18;
const long double PI = acos((long double)-1);
const long double EPS = 1e-9;
inline long long gcd(long long a, long long b) {
  long long r;
  while (b) {
    r = a % b;
    a = b;
    b = r;
  }
  return a;
}
inline long long lcm(long long a, long long b) { return a / gcd(a, b) * b; }
inline long long fpow(long long n, long long k, int p = MOD) {
  long long r = 1;
  for (; k; k >>= 1) {
    if (k & 1) r = r * n % p;
    n = n * n % p;
  }
  return r;
}
template <class T>
inline int chkmin(T& a, const T& val) {
  return val < a ? a = val, 1 : 0;
}
template <class T>
inline int chkmax(T& a, const T& val) {
  return a < val ? a = val, 1 : 0;
}
inline long long isqrt(long long k) {
  long long r = sqrt(k) + 1;
  while (r * r > k) r--;
  return r;
}
inline long long icbrt(long long k) {
  long long r = cbrt(k) + 1;
  while (r * r * r > k) r--;
  return r;
}
inline void addmod(int& a, int val, int p = MOD) {
  if ((a = (a + val)) >= p) a -= p;
}
inline void submod(int& a, int val, int p = MOD) {
  if ((a = (a - val)) < 0) a += p;
}
inline int mult(int a, int b, int p = MOD) { return (long long)a * b % p; }
inline int inv(int a, int p = MOD) { return fpow(a, p - 2, p); }
inline int sign(long double x) { return x < -EPS ? -1 : x > +EPS; }
inline int sign(long double x, long double y) { return sign(x - y); }
const int maxn = 4e5 + 5;
int n;
int x[maxn][2];
int y[maxn][2];
int rem[maxn];
int f[maxn];
priority_queue<int> v[maxn << 2];
int mx[maxn << 3];
int mn[maxn << 3];
void pull(int p) {
  while (int((v[p]).size()) && rem[v[p].top()]) v[p].pop();
  int t = !int((v[p]).size()) ? -1 : v[p].top();
  if (t <= max(mx[p << 1], mx[p << 1 | 1])) {
    mx[p] = max(mx[p << 1], mx[p << 1 | 1]);
  } else {
    if (f[t] || t < min(mn[p << 1], mn[p << 1 | 1])) {
      mx[p] = -1;
    } else {
      mx[p] = t;
    }
  }
  mn[p] = max(t, min(mn[p << 1], mn[p << 1 | 1]));
}
void upd(int p, int l, int r, int L, int R, int id) {
  if (R < l || r < L) return;
  if (l <= L && R <= r) {
    v[p].push(id);
    pull(p);
    return;
  }
  upd(p << 1, l, r, L, L + R >> 1, id);
  upd(p << 1 | 1, l, r, (L + R >> 1) + 1, R, id);
  pull(p);
}
void upd(int p, int l, int r, int L, int R) {
  if (R < l || r < L) return;
  if (l <= L && R <= r) {
    pull(p);
    return;
  }
  upd(p << 1, l, r, L, L + R >> 1);
  upd(p << 1 | 1, l, r, (L + R >> 1) + 1, R);
  pull(p);
}
void thjchph4trjnh() {
  cin >> n;
  vector<int> dcx, dcy;
  for (int i = (0); i < (n); ++i) {
    for (int j = (0); j < (2); ++j) {
      cin >> x[i][j] >> y[i][j];
      dcx.push_back(x[i][j]);
      dcy.push_back(y[i][j]);
    }
  }
  sort((dcx).begin(), (dcx).end()),
      (dcx).erase(unique((dcx).begin(), (dcx).end()), (dcx).end());
  sort((dcy).begin(), (dcy).end()),
      (dcy).erase(unique((dcy).begin(), (dcy).end()), (dcy).end());
  static vector<pair<int, int> > events[maxn];
  for (int i = (0); i < (n); ++i) {
    for (int j = (0); j < (2); ++j) {
      x[i][j] = lower_bound((dcx).begin(), (dcx).end(), x[i][j]) - dcx.begin();
      y[i][j] = lower_bound((dcy).begin(), (dcy).end(), y[i][j]) - dcy.begin();
      y[i][j] <<= 1;
    }
    events[x[i][0]].push_back(make_pair(i, 0));
    events[x[i][1]].push_back(make_pair(i, 1));
  }
  for (int i = (0); i < (maxn << 3); ++i) mx[i] = -1;
  for (int i = (0); i < (maxn); ++i) {
    for (pair<int, int> e : events[i]) {
      int ix = e.first;
      if (!e.second) {
        upd(1, y[ix][0], y[ix][1], 0, maxn - 1, ix + 1);
      } else {
        rem[ix + 1] = 1;
        upd(1, y[ix][0], y[ix][1], 0, maxn - 1);
      }
    }
    while (mx[1] > 0) {
      int ix = mx[1] - 1;
      f[ix + 1] = 1;
      upd(1, y[ix][0], y[ix][1], 0, maxn - 1);
    }
  }
  cout << accumulate(f, f + maxn, 1) << "\n";
}
int main(int argc, char* argv[]) {
  ios_base::sync_with_stdio(0), cin.tie(0);
  if (argc > 1) {
    assert(freopen(argv[1], "r", stdin));
  }
  if (argc > 2) {
    assert(freopen(argv[2], "wb", stdout));
  }
  thjchph4trjnh();
  cerr << "\nTime elapsed: " << 1000 * clock() / CLOCKS_PER_SEC << "ms\n";
  return 0;
}
