#include <bits/stdc++.h>
using namespace std;
const int N = 4e5 + 5;
pair<int, int> p[N];
map<int, int> in;
vector<int> G;
int bit[N];
bool used[N];
void add(int i, int x) {
  while (i < N) {
    bit[i] += x;
    i += ((i) & -(i));
  }
}
int get(int i) {
  int res = 0;
  while (i) {
    res += bit[i];
    i -= ((i) & -(i));
  }
  return res;
}
bool cmp(pair<int, int> a, pair<int, int> b) {
  if (a.second != b.second) return a.second > b.second;
  return a.first < b.first;
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = (1); i < (n + 1); i++) {
    scanf("%d%d", &p[i].first, &p[i].second);
    G.push_back(p[i].second);
    G.push_back(p[i].first);
  }
  sort(G.begin(), G.end());
  G.erase(unique(G.begin(), G.end()), G.end());
  for (int i = (1); i < (n + 1); i++) {
    p[i].first = lower_bound(G.begin(), G.end(), p[i].first) - G.begin() + 1;
    p[i].second = lower_bound(G.begin(), G.end(), p[i].second) - G.begin() + 1;
  }
  sort(p + 1, p + n + 1, cmp);
  long long ans = 0;
  p[n + 1].first = N;
  p[n + 1].second = p[n].second;
  for (int i = (1); i < (n + 1); i++) {
    if (!used[p[i].first]) add(p[i].first, 1), used[p[i].first] = true;
    int r;
    if (p[i + 1].second == p[i].second)
      r = p[i + 1].first - 1;
    else
      r = N - 1;
    long long s = get(r);
    long long L = get(p[i].first);
    ans += L * (s - L + 1);
  }
  printf("%lld\n", ans);
  return 0;
}
