[//]: # 递增三元组 参考写出来的详解
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
typedef long long LL;
int n;
//int a[N],b[N],c[N];
int arr[3][N];
int main(){
scanf("%d",&n);/*
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) scanf("%d",&b[i]);
for(int i=1;i<=n;i++) scanf("%d",&c[i]);*/
/*
//暴力
int res=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=n;k++){
//printf("%d-%d-%d\n",i,j,k);
if((a[i]<b[j])&&(b[j]<c[k])) {
//printf("%d-%d-%d\n",i,j,k);
res++;
}
}
}
}
printf("%d\n",res);*/
//优化代码
LL res=0;
for(int i=0;i<3;i++){
for(int j=1;j<=n;j++){
scanf("%d",&arr[i][j]);
}
}
//对每一行的数据都进行排序(从小到大)
for(int i=0;i<3;i++){
sort(arr[i]+1,arr[i]+n+1);//因为列的下标是从1开始的,所以要+1
}
int a=1,c=1;
//双指针去枚举B,找到满足条件的A,C
for(int i=1;i<=n;i++){
int num=arr[1][i];//找到小于B的A,大于B的C
while(a<=n && num>arr[0][a]) a++;
//因为数组都是从小到达排序的,我们要找的是在a数组中满足a<b的个数,如果b大于a的情况下,指针前进。
//找到最后一个小于b的数下标,则它前面的所有数都会小于b
while(c<=n && num>=arr[2][c]) c++;
//从小到大排序,寻找b<c,如果找到的c大于b,那它后面的所有数都大于b
//找到第一个大于等于的c,则算术是n-c+1得到后面的个数。
//printf("%d-%d-%d\n",a,c,res);
res+=(LL)(a-1)*(n-c+1);
}
printf("%lld\n",res);
return 0;
}