using System;
using System.Collections.Generic;
using System.Linq;

namespace ABC077C
{
    class Program
    {

        static void Main(string[] args)
        {
            int N = int.Parse(Console.ReadLine());
            int[] A = ReadInt();
            int[] B = ReadInt();
            int[] C = ReadInt();
            A = A.OrderBy(x => x).ToArray();
            B = B.OrderBy(x => x).ToArray();
            C = C.OrderBy(x => x).ToArray();

            long[] Bunder = new long[N];
            for (int i = 0; i < N; i++)
            {
                int indexA = binary_search(A, B[i]);
                Bunder[i] = indexA;
                if (i > 0) Bunder[i] += Bunder[i - 1];
            }

            long[] Cunder = new long[N];
            for (int i = 0; i < N; i++)
            {
                int indexB = binary_search(B, C[i]) - 1;
                if (indexB >= 0) Cunder[i] = Bunder[indexB];
            }

            long ans = Cunder.Sum();
            Console.WriteLine(ans);
            Console.ReadKey();
        }


        /// <summary>
        /// 二分探索
        /// </summary>
        /// <param name="sortedNums"></param>
        /// <param name="num"></param>
        /// <param name="left"></param>
        /// <param name="right"></param>
        /// <returns></returns>
        public static int BinarySearch<T>(T[] array, T target) where T : IComparable<T>
        {
            int min = 0;
            int max = array.Length - 1;

            while (true)
            {
                // 範囲内に見つからなかった
                //if (max < min) return max;
                // 範囲内の中央値と比較する
                int mid = min + (max - min) / 2;
                switch (target.CompareTo(array[mid]))
                {
                    case -1:    // 中央値より小さい
                        max = mid - 1;
                        if (max < min) return max;
                        break;
                    case 1:     // 中央値より大きい
                        min = mid + 1;
                        if (max < min) return max;
                        break;
                    case 0:     // 見つかった
                        return mid - 1;
                }
            }
        }

        // index が条件を満たすかどうか
        static public bool isOK(int[] sorterArray, int index, int key)
        {
            if (sorterArray[index] >= key) return true;
            else return false;
        }
        // 汎用的な二分探索のテンプレ
        static public int binary_search(int[] sortedArray, int key)
        {
            int ng = -1; //「index = 0」が条件を満たすこともあるので、初期値は -1
            int ok = (int)sortedArray.Length; // 「index = a.size()-1」が条件を満たさないこともあるので、初期値は a.size()

            /* ok と ng のどちらが大きいかわからないことを考慮 */
            while (Math.Abs(ok - ng) > 1)
            {
                int mid = (ok + ng) / 2;

                if (isOK(sortedArray,mid, key)) ok = mid;
                else ng = mid;
            }
            return ok;
        }

        static int[] ReadInt()
        {
            int[] ret = Console.ReadLine().Split().Select(int.Parse).ToArray();
            return ret;
        }
        static long[] ReadLong()
        {
            long[] ret = Console.ReadLine().Split().Select(long.Parse).ToArray();
            return ret;
        }
    }
}


Measured memory_bytes: 42348