思路:
三维偏序问题 固定某两位选手 计算逆序数对 会有重复计算排名高 和 排名低的情况 最终答案除以2即可

#include <bits/stdc++.h>

using namespace std;

#define LL long long
#define ULL unsigned long long
#define mes(x, a) memset(x, a, sizeof(x));
#define sca(a) scanf("%d", &a)
#define lowbit(x) x&(-x)
#define mk make_pair
#define pb(x) push_back(x)
#define all(x) (x).begin(), (x).end()
#define fi first
#define se second
#define lson v << 1
#define rson v << 1 | 1
#define pii pair<int, int>

inline void read(int &x)
{
    x=0;
    int flag_read=1;
    char c=getchar();
    while(c<'0'||c>'9')
    {
        if(c=='-')
            flag_read=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        x=(x<<3)+(x<<1)+c-'0';
        c=getchar();
    }
    x *= flag_read;
}

const int N = 200005;

int a[N],b[N],c[N];

int t[N],sum[N];

int n;

void update(int i,int x){
    for(;i <= n;i += lowbit(i)){
        sum[i] += x;
    }
}

LL query(int i){
    LL res = 0;

    for(;i > 0;i -= lowbit(i)){
        res += sum[i];
    }

    return res;
}

LL solve(int a[],int b[]){
    memset(sum,0,sizeof(sum));

    for(int i = 1;i <= n;i ++){
        t[a[i]] = b[i];
    }

    LL res = 0;

    for(int i = 1;i <= n;i ++){
        res += query(n) - query(t[i]);
        update(t[i],1);
    }

    return  res;
}

int main(){
    read(n);

    for(int i = 1;i <= n;i ++){
        read(a[i]),read(b[i]),read(c[i]);
    }

    LL res = 0;

    res = solve(a,b) + solve(b,c) + solve(a,c);

    printf("%lld\n",res / 2);

    return 0;
}