#include <bits/stdc++.h>
using namespace std;
struct name {
  int b, i, r;
};
name A[1048576 / 2];
int tr[1048576];
int get_max(int t, int l, int r, int L) {
  if (r < L) return 0;
  if (l >= L) return tr[t];
  return max(get_max(2 * t, l, (l + r) / 2, L),
             get_max(2 * t + 1, (l + r) / 2 + 1, r, L));
}
void upd_max(int t, int l, int r, int X, int Y) {
  if (r < X || l > X) return;
  if (l == r) {
    tr[t] = max(tr[t], Y);
    return;
  }
  upd_max(2 * t, l, (l + r) / 2, X, Y);
  upd_max(2 * t + 1, (l + r) / 2 + 1, r, X, Y);
  tr[t] = max(tr[2 * t], tr[2 * t + 1]);
}
bool bb(name A, name B) { return A.b < B.b; }
bool ii(name A, name B) { return A.i < B.i; }
bool rr(name A, name B) { return A.r < B.r; }
int n, i, j, x, st, ans;
int main() {
  cin >> n;
  for (i = 1; i <= n; i++) scanf("%d", &A[i].b);
  for (i = 1; i <= n; i++) scanf("%d", &A[i].i);
  for (i = 1; i <= n; i++) scanf("%d", &A[i].r);
  sort(A + 1, A + n + 1, bb);
  st = -1;
  for (i = 1; i <= n; i++) {
    x = A[i].b;
    A[i].b = A[i - 1].b + (st != x);
    st = x;
  }
  sort(A + 1, A + n + 1, ii);
  st = -1;
  for (i = 1; i <= n; i++) {
    x = A[i].i;
    A[i].i = A[i - 1].i + (st != x);
    st = x;
  }
  sort(A + 1, A + n + 1, rr);
  reverse(A + 1, A + n + 1);
  st = -1;
  for (i = 1; i <= n; i++)
    if (A[i].r != st) {
      j = i;
      while (j <= n && A[i].r == A[j].r) j++;
      for (int k = i; k < j; k++)
        if (get_max(1, 1, n, A[k].b + 1) > A[k].i) ans++;
      for (int k = i; k < j; k++) upd_max(1, 1, n, A[k].b, A[k].i);
      i = j - 1;
      st = A[i].r;
    }
  cout << ans << endl;
}
