#include <bits/stdc++.h>
using namespace std;
int uk = 0, n, m, t[2000006], sz, k = 0, ans = 0;
map<int, int> h;
pair<int, int> st[500005];
struct node {
  int b, i, r;
} a[500005];
bool comp1(node a, node b) { return a.b > b.b; }
bool comp2(node a, node b) { return a.i < b.i; }
int getmax(int v, int tl, int tr, int l, int r) {
  if (tl >= l && tr <= r)
    return t[v];
  else {
    int tm = (tl + tr) / 2;
    if (tm >= r)
      return getmax(v * 2, tl, tm, l, r);
    else if (tm < l)
      return getmax(v * 2 + 1, tm + 1, tr, l, r);
    else
      return max(getmax(v * 2, tl, tm, l, r),
                 getmax(v * 2 + 1, tm + 1, tr, l, r));
  }
}
void change(int v, int tl, int tr, int pos, int to) {
  if (tl == tr)
    t[v] = max(to, t[v]);
  else {
    int tm = (tl + tr) / 2;
    if (pos <= tm)
      change(v * 2, tl, tm, pos, to);
    else
      change(v * 2 + 1, tm + 1, tr, pos, to);
    t[v] = max(t[v * 2], t[v * 2 + 1]);
  }
}
void work_stack() {
  while (uk > 0) {
    change(1, 0, sz - 1, st[uk].first, st[uk].second);
    uk--;
  }
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i < n; i++) scanf("%d", &a[i].b);
  for (int i = 0; i < n; i++) scanf("%d", &a[i].i);
  for (int i = 0; i < n; i++) scanf("%d", &a[i].r);
  sz = 2;
  while (sz <= n) sz *= 2;
  sort(a, a + n, comp2);
  for (int i = 0; i < n; i++)
    if (!h[a[i].i]) {
      h[a[i].i] = ++k;
    }
  sort(a, a + n, comp1);
  for (int i = 0; i < n; i++) {
    if (i > 0)
      if (uk > 0 && a[i].b != a[i - 1].b) work_stack();
    if (getmax(1, 0, sz - 1, h[a[i].i], sz - 1) > a[i].r) ans++;
    st[++uk].first = h[a[i].i] - 1;
    st[uk].second = a[i].r;
  }
  printf("%d", ans);
  return 0;
}
