description: Monocarp is the coach of the Berland State University programming teams. He decided to compose a problemset for a training session for his teams.
  
  Monocarp has n problems that none of his students have seen yet. The i-th problem has a topic a_i (an integer from 1 to n) and a difficulty b_i (an integer from 1 to n). All problems are different, that is, there are no two tasks that have the same topic and difficulty at the same time.
  
  Monocarp decided to select exactly 3 problems from n problems for the problemset. The problems should satisfy at least one of two conditions (possibly, both):
  
    * the topics of all three selected problems are different; 
    * the difficulties of all three selected problems are different. 
  
  
  
  Your task is to determine the number of ways to select three problems for the problemset.
  
  Input
  
  The first line contains a single integer t (1 ≤ t ≤ 50000) — the number of testcases.
  
  The first line of each testcase contains an integer n (3 ≤ n ≤ 2 ⋅ 10^5) — the number of problems that Monocarp have.
  
  In the i-th of the following n lines, there are two integers a_i and b_i (1 ≤ a_i, b_i ≤ n) — the topic and the difficulty of the i-th problem.
  
  It is guaranteed that there are no two problems that have the same topic and difficulty at the same time.
  
  The sum of n over all testcases doesn't exceed 2 ⋅ 10^5.
  
  Output
  
  Print the number of ways to select three training problems that meet either of the requirements described in the statement.
  
  Example
  
  Input
  
  
  2
  4
  2 4
  3 4
  2 1
  1 3
  5
  1 5
  2 4
  3 3
  4 2
  5 1
  
  
  Output
  
  
  3
  10
  
  Note
  
  In the first example, you can take the following sets of three problems:
  
    * problems 1, 2, 4; 
    * problems 1, 3, 4; 
    * problems 2, 3, 4. 
  
  
  
  Thus, the number of ways is equal to three.
solution: try:
          import sys
          from functools import lru_cache, cmp_to_key
          from heapq import merge, heapify, heappop, heappush
          # from math import *
          from collections import defaultdict as dd, deque, Counter as C
          from itertools import combinations as comb, permutations as perm
          from bisect import bisect_left as bl, bisect_right as br, bisect, insort
          from time import perf_counter
          from fractions import Fraction
          import copy
          from copy import deepcopy
          import time
          starttime = time.time()
          mod = int(pow(10, 9) + 7)
          mod2 = 998244353
  
          def data(): return sys.stdin.readline().strip()
          def out(*var, end="\n"): sys.stdout.write(' '.join(map(str, var))+end)
          def L(): return list(sp())
          def sl(): return list(ssp())
          def sp(): return map(int, data().split())
          def ssp(): return map(str, data().split())
          def l1d(n, val=0): return [val for i in range(n)]
          def l2d(n, m, val=0): return [l1d(n, val) for j in range(m)]
          def A2(n,m): return [[0]*m for i in range(n)]
          def A(n):return [0]*n
          # sys.setrecursionlimit(int(pow(10,6)))
          # from sys import stdin
          # input = stdin.buffer.readline
          # I = lambda : list(map(int,input().split()))
          # import sys
          # input=sys.stdin.readline
          
  
          sys.stdin = open("input.txt", "r")
          sys.stdout = open("output.txt", "w")
  except:
          pass
  
  import sys
  input=sys.stdin.readline
  for _ in range(L()[0]):
          n = L()[0]
          
          X = [L() for  i in range(n)]
  
          par = [i for i in range(n+1)]
  
          
          Y = [[X[i][0],i+1] for i in range(n)]
          Y.sort()
          d = dd(int)
          for i in range(n):
                  x,y = Y[i]
                  if x not in d:
                          d[x]=par[y]
                  else:
                          par[y]=d[x]
  
  
  
          par1 = par[::]
          par = [i for i in range(n+1)]
  
  
  
  
          Y = [[X[i][1],i+1] for i in range(n)]
          Y.sort()
          d = dd(int)
          for i in range(n):
                  x,y = Y[i]
                  if x not in d:
                          d[x]=par[y]
                  else:
                          par[y]=d[x]
                          
  
          
          ans = (n*(n-1)*(n-2))//6
          d1 = dd(int)
          d2 = dd(int)
          for i in range(1,n+1):
                  d1[par[i]]+=1
                  d2[par1[i]]+=1
  
          
          for i in range(1,n+1):
                  x = d1[par[i]]
                  y = d2[par1[i]]
                  ans -= ( (x-1)*(y-1) )
          print(ans)
          
  