import sys

read = sys.stdin.buffer.read

readline = sys.stdin.buffer.readline

readlines = sys.stdin.buffer.readlines



def abc077_c():

    N = int(readline())

    A = list(map(int, readline().split()))

    B = list(map(int, readline().split()))

    C = list(map(int, readline().split()))

    A.sort()

    B.sort()

    C.sort()

    ans = 0



    from bisect import bisect_left



    # Bjに対するCの使える個数は、前処理で求めておく

    B2C = [0] * N

    # 真に大きいが条件なので Ai + 1 が入るポイントを探す

    for j in range(N):

        B2C[j] = N - bisect_left(C, B[j]+1)

    # 累積和

    accum = [0]

    for j in range(N):

        accum.append(accum[-1] + B2C[j])



    # Ai -> B は二分探索

    for i in range(N):

        jst = bisect_left(B, A[i]+1)

        if jst == N: continue

        # 前処理済みなので、Bj以降を使ったときにCが何個使えるかはすぐわかる

        ans += accum[N] - accum[jst]

    print(ans)



abc077_c()
import sys

read = sys.stdin.buffer.read

readline = sys.stdin.buffer.readline

readlines = sys.stdin.buffer.readlines

import numpy as np



def abc077_c():

    ''' maspyさんお手本 '''

    N = int(readline())

    A = np.array(readline().split(), dtype=np.int64)

    B = np.array(readline().split(), dtype=np.int64)

    C = np.array(readline().split(), dtype=np.int64)



    A.sort()

    B.sort()

    C.sort()



    # 各Bに対して使えるAの個数

    cnt_A = np.searchsorted(A, B, side='left')

    # 各Bに対して使えないCの個数

    cnt_C_not = np.searchsorted(C, B, side='right')

    # 各Bに対して使えるCの個数

    cnt_C = N - cnt_C_not

    # 別の書き方

    # cnt_C_alt = np.searchsorted(-1 * np.flip(C), -1 * B, side='left')



    ans = np.multiply(cnt_A, cnt_C).sum()

    print(ans)



abc077_c()
import sys

read = sys.stdin.buffer.read
readline = sys.stdin.buffer.readline
readlines = sys.stdin.buffer.readlines


def abc077_c():
    N = int(readline())
    A = list(map(int, readline().split()))
    B = list(map(int, readline().split()))
    C = list(map(int, readline().split()))
    A.sort()
    B.sort()
    C.sort()
    ans = 0
    from bisect import bisect_left

    # Bjに対するCの使える個数は、前処理で求めておく
    B2C = [0] * N
    # 真に大きいが条件なので Ai + 1 が入るポイントを探す
    for j in range(N):
        B2C[j] = N - bisect_left(C, B[j] + 1)
    # 累積和
    accum = [0]
    for j in range(N):
        accum.append(accum[-1] + B2C[j])
    # Ai -> B は二分探索
    for i in range(N):
        jst = bisect_left(B, A[i] + 1)
        if jst == N:
            continue
        # 前処理済みなので、Bj以降を使ったときにCが何個使えるかはすぐわかる
        ans += accum[N] - accum[jst]
    print(ans)


abc077_c()

import sys

read = sys.stdin.buffer.read
readline = sys.stdin.buffer.readline
readlines = sys.stdin.buffer.readlines
import numpy as np


def abc077_c():
    """maspyさんお手本"""
    N = int(readline())
    A = np.array(readline().split(), dtype=np.int64)
    B = np.array(readline().split(), dtype=np.int64)
    C = np.array(readline().split(), dtype=np.int64)
    A.sort()
    B.sort()
    C.sort()
    # 各Bに対して使えるAの個数
    cnt_A = np.searchsorted(A, B, side="left")
    # 各Bに対して使えないCの個数
    cnt_C_not = np.searchsorted(C, B, side="right")
    # 各Bに対して使えるCの個数
    cnt_C = N - cnt_C_not
    # 別の書き方
    # cnt_C_alt = np.searchsorted(-1 * np.flip(C), -1 * B, side='left')
    ans = np.multiply(cnt_A, cnt_C).sum()
    print(ans)


abc077_c()

+import numpy as np +    """maspyさんお手本""" -    A = list(map(int, readline().split())) -    B = list(map(int, readline().split())) -    C = list(map(int, readline().split())) +    A = np.array(readline().split(), dtype=np.int64) +    B = np.array(readline().split(), dtype=np.int64) +    C = np.array(readline().split(), dtype=np.int64) -    ans = 0 -    from bisect import bisect_left - -    # Bjに対するCの使える個数は、前処理で求めておく -    B2C = [0] * N -    # 真に大きいが条件なので Ai + 1 が入るポイントを探す -    for j in range(N): -        B2C[j] = N - bisect_left(C, B[j] + 1) -    # 累積和 -    accum = [0] -    for j in range(N): -        accum.append(accum[-1] + B2C[j]) -    # Ai -> B は二分探索 -    for i in range(N): -        jst = bisect_left(B, A[i] + 1) -        if jst == N: -            continue -        # 前処理済みなので、Bj以降を使ったときにCが何個使えるかはすぐわかる -        ans += accum[N] - accum[jst] +    # 各Bに対して使えるAの個数 +    cnt_A = np.searchsorted(A, B, side="left") +    # 各Bに対して使えないCの個数 +    cnt_C_not = np.searchsorted(C, B, side="right") +    # 各Bに対して使えるCの個数 +    cnt_C = N - cnt_C_not +    # 別の書き方 +    # cnt_C_alt = np.searchsorted(-1 * np.flip(C), -1 * B, side='left') +    ans = np.multiply(cnt_A, cnt_C).sum()