//AtCoder Beginner Contest 077 C - Snuke Festival
//計算時間短縮その３

//#define DEBUG1
//#define DEBUG2
//#define DEBUG3

#include <stdio.h>
#include <stdlib.h>

int P[3][100000];

//変数
int miman = -1;
int koeru = -1;

int cmp(const void *p, const void *q) {
	return *(int*)p - *(int*)q;
}

int main(void) {
	int n = 0;
	int i, j;

	//入力パラメータ


	//入力作業
	scanf("%d", &n);
	for (i = 0; i < 3; i++) {
		for (j = 0; j < n; j++) {
			scanf("%d", &P[i][j]);
		}
	}
#ifdef DEBUG
	for (i = 0; i < 3; i++) {
		for (j = 0; j < n; j++) {
			printf("P[%d][%d] = %d\n", i, j, P[i][j]);
		}
	}
#endif
	//ソート作業
	for (i = 0; i < 3; i++) {
		qsort(P[i], n, sizeof(int), cmp);
	}
#ifdef DEBUG2
	for (i = 0; i < 3; i++) {
		for (j = 0; j < n; j++) {
			printf("P[%d][%d] = %d\n", i, j, P[i][j]);
		}
	}
#endif

#ifdef DEBUG2
	//テストパターン
	//tansaku(P[0], n, P[1][0]);
	//tansaku(P[2], n, P[1][0]);
	//tansaku(P[0], n, P[2][5]);
	//tansaku(P[1], n, P[0][0]);
#endif

#ifdef DEBUG2
	//printf("mid_r = %d\n", mid_r);
	//printf("mid_l = %d\n", mid_l);
	//getch();
#endif

	int r, t;
	int total = 0;

	for (j = 0; j < n; j++) {
		int tmp = -1;
		tansaku(P[0], n, P[1][j]);
		tmp = miman;
		tansaku(P[2], n, P[1][j]);
		tmp = tmp * koeru;
		total = total + tmp;
#ifdef DEBUG3
		printf("total = %d\n", total);
#endif
	}
		printf("%d", total);
		//getch();
#ifdef DEBUG3
	getch();
#endif
	return 0;
}


////入力パラメータ
////Vac>0 一致無し 端では無い
////int a[6] = { 1,2,4,6,8,9 };//ソート済の配列　要素数は仮
////int n = 6;//要素数
////int x = 7;//探したい値
//
//		  //Vac>0 一致無し　＋オーバー
//		  //int a[6] = { 1,2,4,6,8,9 };//ソート済の配列　要素数は仮
//		  //int n = 6;//要素数
//		  //int x = 10;//探したい値
//
//		  //Vac>0　一致
//		  //int a[6] = { 1,2,3,4,9,10 };//ソート済の配列　要素数は仮
//		  //int n = 6;//要素数
//		  //int x = 9;//探したい値
//
//		  //Vac>0 一致無し　-オーバーはあり得ないので検討不要
//
//		  //Vac<0 一致無し
//		  //int a[6] = { 1,3,4,5,10,11 };//ソート済の配列　要素数は仮
//		  //int n = 6;//要素数
//		  //int x = 2;//探したい値
//
//		  //Vac<0 一致無し
//		  //int a[6] = { 2,3,4,5,10,11 };//ソート済の配列　要素数は仮
//		  //int n = 6;//要素数
//		  //int x = 1;//探したい値
int tansaku(int a[], int n, int x) {

	int left = 0;
	int right = n - 1;
	int result = -1;
	int mid = -1;
	int _L = -1;
	int	_R = -1;
	//int miman = -1;
	//int koeru = -1;

	//正常処理
#ifdef DEBUG2
	printf("x = %d\n", x);
#endif
	int Vec = 0;//ベクトル指標

	while (left <= right) {
		mid = (left + right) / 2;

		if (a[mid] == x) {
#ifdef DEBUG2
			printf("a[%d]=%d == %d\n", mid, a[mid], x);
#endif
			result = mid;
			Vec = 0;
			left = right;//処理終了フラグ
		}
		if (a[mid] > x) {
#ifdef DEBUG2
			printf("a[%d]=%d > %d\n", mid, a[mid], x);
#endif
			right = mid - 1;
			Vec = -1;
		}
		if (a[mid] < x) {
#ifdef DEBUG2
			printf("a[%d]=%d < %d\n", mid, a[mid], x);
#endif
			left = mid + 1;
			Vec = 1;
		}
	}
	//一致の場合
	if (result != -1) {
#ifdef DEBUG2
		printf("Vec = %d\n", Vec);
		printf("result = %d\n", result);
		printf("P[%d] = x \n", result, x);
#endif
	}

	//一致では無い場合
	if (result == -1) {
		//場所の調査
		if (Vec > 0) {
#ifdef DEBUG2
			printf("Vec = %d\n", Vec);
#endif
			_L = mid;
#ifdef DEBUG2
			printf("P[%d] < %d \n", _L, x);
#endif
		}
		if (Vec < 0) {
#ifdef DEBUG2
			printf("Vec = %d\n", Vec);
#endif
			_R = mid;
#ifdef DEBUG2
			printf("%d < P[%d]\n", x, _R);
#endif
		}
	}

	//未満と超えるの要素数の算出
	if (result != -1) {
		miman = n - result + 1;
		koeru = n - miman - 1;
	}
	if (_L != -1 && _R == -1) {
		miman = _L + 1;
		koeru = n - miman;
	}
	if (_L == -1 && _R != -1) {
		miman = _R + 1 - 1;
		koeru = n - miman;
	}
#ifdef DEBUG2
	printf("未満要素数 = %d\n", miman);
	printf("超える要素数 = %d\n", koeru);
	getch();
#endif
	return 0;
}