#include <bits/stdc++.h>
using namespace std;
struct Node {
  int p, x, y;
  Node() { p = x = y = 0; }
  bool operator<(const Node &r) const { return p < r.p; }
};
set<Node> S;
set<pair<int, int> > C;
map<pair<int, int>, vector<Node> > I;
bool Ccont(int x, int y) { return C.find(make_pair(x, y)) != C.end(); }
void addD(Node &r, int x, int y) {
  pair<int, int> p(x, y);
  I[p];
  I[p].push_back(r);
}
bool Can(Node &r) {
  if (Ccont(r.x, r.y + 1) && (!Ccont(r.x + 1, r.y) && !Ccont(r.x - 1, r.y))) {
    addD(r, r.x, r.y + 1);
    return false;
  }
  if (Ccont(r.x + 1, r.y + 1) &&
      (!Ccont(r.x + 1, r.y) && !Ccont(r.x + 2, r.y))) {
    addD(r, r.x + 1, r.y + 1);
    return false;
  }
  if (Ccont(r.x - 1, r.y + 1) &&
      (!Ccont(r.x - 2, r.y) && !Ccont(r.x - 1, r.y))) {
    addD(r, r.x - 1, r.y + 1);
    return false;
  }
  return true;
}
long long r = 0;
int n;
bool Take(Node m) {
  S.erase(S.find(m));
  if (Can(m)) {
    r = (r * n + m.p) % 1000000009;
    ;
    pair<int, int> p(m.x, m.y);
    for (int i = 0; i < I[p].size(); i++) {
      S.insert(I[p][i]);
    }
    C.erase(C.find(p));
    return 1;
  }
  return false;
}
int main() {
  cin >> n;
  for (int i = 0; i < n; i++) {
    Node N;
    cin >> N.x >> N.y;
    C.insert(make_pair(N.x, N.y));
    N.p = i;
    S.insert(N);
  }
  while (C.size()) {
    while (1) {
      Node m = (*S.rbegin());
      if (Take(m)) {
        break;
      }
    }
    if (C.size() == 0) {
      break;
    }
    while (1) {
      Node m = (*S.begin());
      if (Take(m)) {
        break;
      }
    }
  }
  cout << r << endl;
  return 0;
}
