# 解説したb→cを先に計算、その後累積和を取る解法

import bisect

n=int(eval(input()))

# 面倒なので最初にソートしちゃいましょう。

a=sorted(list(map(int,input().split())))

b=sorted(list(map(int,input().split())))

c=sorted(list(map(int,input().split())))



# 各bについてcで使えるのが何種類存在するか

cnum=[0 for i in range(n)]

for i in range(n):

    cnum[i] = len(c) - bisect.bisect_right(c,b[i])

# cnumの累積和

accum=[0 for i in range(n+1)]

for i in reversed(list(range(n))):

    accum[i]=accum[i+1]+cnum[i]

# 各a[i]について、使えるb,cの組み合わせの通り数を答えに加算していく

ret=0

for i in range(n):

    idx=bisect.bisect_right(b,a[i])

    ret+=accum[idx]

print(ret)
# 別解（むしろ想定解）のb→axc解法

import bisect

n=int(eval(input()))

# 面倒なので最初にソートしちゃいましょう。

a=sorted(list(map(int,input().split())))

b=sorted(list(map(int,input().split())))

c=sorted(list(map(int,input().split())))



ret=0

# a<b[i]となるaの個数xb[i]<cとなるcの個数でいいですよね…

for i in range(n):

    numa = bisect.bisect_left(a,b[i])

    numc = len(c) - bisect.bisect_right(c,b[i])

    ret+=numa*numc

print(ret)
# 解説したb→cを先に計算、その後累積和を取る解法
import bisect

n = int(eval(input()))
# 面倒なので最初にソートしちゃいましょう。
a = sorted(list(map(int, input().split())))
b = sorted(list(map(int, input().split())))
c = sorted(list(map(int, input().split())))
# 各bについてcで使えるのが何種類存在するか
cnum = [0 for i in range(n)]
for i in range(n):
    cnum[i] = len(c) - bisect.bisect_right(c, b[i])
# cnumの累積和
accum = [0 for i in range(n + 1)]
for i in reversed(list(range(n))):
    accum[i] = accum[i + 1] + cnum[i]
# 各a[i]について、使えるb,cの組み合わせの通り数を答えに加算していく
ret = 0
for i in range(n):
    idx = bisect.bisect_right(b, a[i])
    ret += accum[idx]
print(ret)

# 別解（むしろ想定解）のb→axc解法
import bisect

n = int(eval(input()))
# 面倒なので最初にソートしちゃいましょう。
a = sorted(list(map(int, input().split())))
b = sorted(list(map(int, input().split())))
c = sorted(list(map(int, input().split())))
ret = 0
# a<b[i]となるaの個数xb[i]<cとなるcの個数でいいですよね…
for i in range(n):
    numa = bisect.bisect_left(a, b[i])
    numc = len(c) - bisect.bisect_right(c, b[i])
    ret += numa * numc
print(ret)

-# 解説したb→cを先に計算、その後累積和を取る解法 +# 別解（むしろ想定解）のb→axc解法 -# 各bについてcで使えるのが何種類存在するか -cnum = [0 for i in range(n)] +ret = 0 +# a<b[i]となるaの個数xb[i]<cとなるcの個数でいいですよね… -    cnum[i] = len(c) - bisect.bisect_right(c, b[i]) -# cnumの累積和 -accum = [0 for i in range(n + 1)] -for i in reversed(list(range(n))): -    accum[i] = accum[i + 1] + cnum[i] -# 各a[i]について、使えるb,cの組み合わせの通り数を答えに加算していく -ret = 0 -for i in range(n): -    idx = bisect.bisect_right(b, a[i]) -    ret += accum[idx] +    numa = bisect.bisect_left(a, b[i]) +    numc = len(c) - bisect.bisect_right(c, b[i]) +    ret += numa * numc