#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;
struct LightHouse {
int x, y;
}* lhs;
void invBetween(int* y, int l, int mid, int r, long long& cnt)
{
int la = mid - l;
int lb = r - mid;
int* A = new int[la];
for (int i = 0, j = l; i < la; A[i++] = y[j++])
;
int* B = y + mid;
for (int i = 0, j = 0, k = l; i < la;) {
if (j >= lb '' A[i] < B[j]) {
y[k++] = A[i++];
// 顺序对
if (j < lb)
cnt += (long long)(lb - j);
}
if (j < lb && A[i] > B[j])
y[k++] = B[j++];
}
// 归并排序核心部分的另种写法,我还怀疑过写法的问题🤣
// int i = 0, j = 0, k = l;
// while(i < la)
// {
// if(j < lb && B[j] < A[i])
// {
// y[k++] = B[j++];
// // 逆序对
// cnt += (long long)(la - i);
// }
// else
// y[k++] = A[i++];
// }
delete[] A;
}
void invInside(int* y, int l, int r, long long& cnt)
{
if (r - l < 2)
return;
int mid = (l + r) / 2;
invInside(y, l, mid, cnt);
invInside(y, mid, r, cnt);
invBetween(y, l, mid, r, cnt);
}
// 下面两个函数用了qsort()后就没用了
void merge(int l, int mid, int r)
{
int la = mid - l;
int lb = r - mid;
LightHouse* A = new LightHouse[la];
for (int i = 0, j = l; i < lb; A[i++] = lhs[j++])
;
LightHouse* B = lhs + mid;
int i = 0, j = 0, k = l;
while (i < la) {
if (j < lb && B[j].x < A[i].x)
lhs[k++] = B[j++];
else
lhs[k++] = A[i++];
}
delete[] A;
}
void mergeSort(int l, int r)
{
if (r - l < 2)
return;
int mid = (1 + r) / 2;
mergeSort(l, mid);
mergeSort(mid, r);
merge(l, mid, r);
}
// void*型指针的一种用法
int cmp(const void* v1, const void* v2)
{
return ((LightHouse*)v1)->x - ((LightHouse*)v2)->x;
}
int main()
{
int n; // the number of lighthouse
scanf("%d", &n);
lhs = new LightHouse[n];
for (int i = 0; i < n; ++i)
scanf("%d %d", &lhs[i].x, &lhs[i].y);
// 题目提示可能超出int表示范围,所以用long long
long long cnt = 0; // the number of sequence
qsort(lhs, n, sizeof(LightHouse), cmp);
// mergeSort(0, n); // sort based on x
int* y = new int[n];
for (int i = 0; i < n; ++i)
y[i] = lhs[i].y;
invInside(y, 0, n, cnt); // compute cnt based on y
// 两种计算方式,第一个是算出逆序对然后C(n,2)减一下,第二个是直接算出顺序对
// printf("%lld", (long long)(n)*(long long)(n-1)/(long long)(2) - cnt);
printf("%lld", cnt);
delete[] lhs;
delete[] y;
return 0;
}