n=int(eval(input()))

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

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

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

a.sort()

b.sort()

c.sort()



import bisect

ans=0

for i in b:

    q=bisect.bisect_left(a,i)

    s=bisect.bisect_right(c,i)

    ans=ans+q*(n-s)

print(ans)

    
#この問題のポイント一つ目　３つ動くときは真ん中を固定する

#真ん中を固定したら下の段からはそれより小さいもの、上の段はそれより大きいものを選べる

#上の段と下の段をsortするとある境界を境にokとngがはっきり分かれる

#二部探索

n=int(eval(input()))

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

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

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

a.sort()

b.sort()

c.sort()

from bisect import bisect_left

from bisect import bisect_right

ans=0

for i in range(n):

  #b[i]を固定する

  ans=ans+bisect_left(a,b[i])*(n-bisect_right(c,b[i]))



  

print(ans)



  
n = int(eval(input()))
a = list(map(int, input().split()))
b = list(map(int, input().split()))
c = list(map(int, input().split()))
a.sort()
b.sort()
c.sort()
import bisect

ans = 0
for i in b:
    q = bisect.bisect_left(a, i)
    s = bisect.bisect_right(c, i)
    ans = ans + q * (n - s)
print(ans)

# この問題のポイント一つ目　３つ動くときは真ん中を固定する
# 真ん中を固定したら下の段からはそれより小さいもの、上の段はそれより大きいものを選べる
# 上の段と下の段をsortするとある境界を境にokとngがはっきり分かれる
# 二部探索
n = int(eval(input()))
a = list(map(int, input().split()))
b = list(map(int, input().split()))
c = list(map(int, input().split()))
a.sort()
b.sort()
c.sort()
from bisect import bisect_left
from bisect import bisect_right

ans = 0
for i in range(n):
    # b[i]を固定する
    ans = ans + bisect_left(a, b[i]) * (n - bisect_right(c, b[i]))
print(ans)

+# この問題のポイント一つ目　３つ動くときは真ん中を固定する +# 真ん中を固定したら下の段からはそれより小さいもの、上の段はそれより大きいものを選べる +# 上の段と下の段をsortするとある境界を境にokとngがはっきり分かれる +# 二部探索 -import bisect +from bisect import bisect_left +from bisect import bisect_right -for i in b: -    q = bisect.bisect_left(a, i) -    s = bisect.bisect_right(c, i) -    ans = ans + q * (n - s) +for i in range(n): +    # b[i]を固定する +    ans = ans + bisect_left(a, b[i]) * (n - bisect_right(c, b[i]))