// iostream is too mainstream
#include <cstdio>
// bitch please
#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <string>
#include <queue>
#include <stack>
#include <algorithm>
#include <iomanip>
#define dibs reserve
#define OVER9000 1234567890
#define patkan 9
#define tisic 47
#define soclose 10e-7
#define ALL_THE(CAKE,LIE) for(auto LIE =CAKE.begin(); LIE != CAKE.end(); LIE++)
#define chocolate win
#define ff first
#define ss second
#define abs(x) ((x < 0)?-(x):(x))
// mylittlepony
using namespace std;

struct info {
	int a,b,c;
	
	bool operator<(const info &A) const {
		return a < A.a;}
	};

struct fin2 {
	vector< vector<long long> > T;
	fin2(int N, int M) {T.resize(N+1,vector<long long>(M+1,0));}

	int lastone(int x) {return x&(x^(x-1));}
 
	long long get(int x, int y) {
		if(x < 0 || y < 0) return 0;
		long long ret =0;
		for(int i =x+1; i > 0; i -=lastone(i)) 
			for(int j =y+1; j > 0; j -=lastone(j)) ret +=T[i][j];
		return ret;}
 
	void put(int x, int y) {
		if(x < 0 || y < 0) return;
		for(int i =x+1; i < T.size(); i +=lastone(i)) 
			for(int j =y+1; j < T[i].size(); j +=lastone(j)) T[i][j]++;}
	};

int main() {
    cin.sync_with_stdio(0);
    int N;
    cin >> N;
    vector<info> V(N);
    for(int i =0; i < N; i++) cin >> V[i].a >> V[i].b >> V[i].c;
    sort(V.begin(),V.end());
    
    long long ans =0;
    vector<int> A(N,N+1);
    vector<int> B(N,N+1);
    fin2 C(500+patkan,500+patkan);
    for(int i =0; i < N; i++) {
    	int x =V[i].b, y =V[i].c;
    	while(x%500 != 0) {
    		if(A[x-1] < y) ans--;
    		x--;}
    	while(y%500 != 0) {
    		if(B[y-1] < x) ans--;
    		y--;}
    	ans -=C.get(x/500-1,y/500-1);
    	A[V[i].b-1] =V[i].c-1;
    	B[V[i].c-1] =V[i].b-1;
    	C.put((V[i].b-1)/500,(V[i].c-1)/500);}

    cout << N*(N-1)/2+ans << "\n";
	return 0;}
        
// look at my code
// my code is amazing