#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9 + 7;
const int infi = 2147483600;
const long long infl = 1e17;
int n;
pair<int, int> pbef[200005];
struct SegmentTree {
 private:
  int N;
  vector<long long> node;
  long long e;

 public:
  SegmentTree() {}
  SegmentTree(long long e) : e(e) {}
  void __init__(int sz) {
    N = 1;
    while (N < sz) N *= 2;
    node.resize(2 * N - 1, e);
  }
  void build(vector<long long> &v) {
    int sz = int(v.size());
    __init__(sz);
    for (long long i = 0; i < (long long)sz; i++) {
      node[i + N - 1] = v[i];
    }
    for (int i = N - 2; i >= 0; i--) {
      node[i] = (node[i * 2 + 1] + node[i * 2 + 2]);
    }
  }
  void update(int k, long long x) {
    k += N - 1;
    node[k] = x;
    while (k > 0) {
      k = (k - 1) / 2;
      node[k] = (node[2 * k + 1] + node[2 * k + 2]);
    }
  }
  void renew(int b, int e, long long x) {
    renew(b, e, 0, 0, N, x);
    return;
  }
  void renew(int b, int e, int k, int l, int r, long long x) {
    if (e <= 0 || b >= N) return;
    if (k > 0) {
      node[k] = (node[k] + node[(k - 1) / 2]);
    }
    if (r < b || e < l) return;
    if (b <= l && r <= e) {
      node[k] = min(node[k], x);
      return;
    } else if (k < N - 1) {
      renew(b, e, 2 * k + 1, l, (l + r) / 2, x);
      renew(b, e, 2 * k + 2, (l + r) / 2, r, x);
      return;
    }
    return;
  }
  long long get(int i) {
    int k = i + N - 1;
    long long res = node[k];
    while (k > 0) {
      k = (k - 1) / 2;
      res = min(res, node[k]);
    }
    return res;
  }
  long long query(int a, int b) { return query(a, b, 0, 0, N); }
  long long query(int a, int b, int k, int l, int r) {
    if (b <= l || r <= a) return e;
    if (a <= l && r <= b) return node[k];
    long long vl, vr;
    vl = query(a, b, 2 * k + 1, l, (l + r) / 2);
    vr = query(a, b, 2 * k + 2, (l + r) / 2, r);
    return (vl + vr);
  }
  void recalc() {
    for (long long k = 0; k < (long long)N - 1; k++) {
      node[2 * k + 1] = (node[2 * k * 1] + node[k]);
      node[2 * k + 2] = (node[2 * k * 2] + node[k]);
    }
  }
  long long show_one(int i) { return node[i + N - 1]; }
  void show() {
    for (long long i = 0; i < (long long)N; i++) cout << node[i] << " ";
    cout << endl;
    return;
  }
};
int main() {
  set<int> xapper, yapper;
  map<int, int> xidx, yidx;
  cin >> n;
  for (long long i = 0; i < (long long)n; i++) {
    int x, y;
    cin >> x >> y;
    xapper.insert(x);
    yapper.insert(y);
    pbef[i] = make_pair(x, y);
  }
  int xcnt = 0;
  for (auto x : xapper) {
    xidx[x] = xcnt;
    xcnt++;
  }
  int ycnt = 0;
  for (auto y : yapper) {
    yidx[y] = ycnt;
    ycnt++;
  }
  ycnt--;
  map<int, set<int>> p;
  for (long long i = 0; i < (long long)n; i++) {
    p[yidx[pbef[i].second]].insert(xidx[pbef[i].first]);
  }
  SegmentTree seg(0);
  seg.__init__(xcnt);
  long long ans = 0;
  int bef = 0;
  for (long long y = (long long)ycnt; y > (long long)-1; y--) {
    int cnt = 0;
    int nwe = 0;
    int bef = 0;
    for (auto x : p[y]) {
      seg.update(x, 1);
    }
    for (auto x : p[y]) {
      if (seg.show_one(x) == 0) {
        ans += (seg.query(0, x + 1) - bef) * seg.query(x, xcnt);
        nwe++;
      } else {
        ans += (seg.query(0, x + 1) - bef) * seg.query(x, xcnt);
      }
      bef = seg.query(0, x + 1);
      cnt++;
    }
  }
  cout << ans << endl;
}
