#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100010;
int N, MOD = 1e9 + 9;
int x[MAXN], y[MAXN], toca[MAXN];
map<pair<int, int>, int> mapa;
set<int> segura[MAXN], segurado[MAXN], livres;
int simulate() {
  long long vez = 0, ans = 0;
  while (livres.size() > 0) {
    long long ele;
    if (!vez)
      ele = *livres.rbegin();
    else
      ele = *livres.begin();
    livres.erase(ele);
    vez ^= 1;
    ans = (((ans * N) % MOD) + ele) % MOD;
    for (auto& it : segurado[ele]) {
      segura[it].erase(ele);
      bool pode = 1;
      for (auto& it1 : segura[it])
        if (segurado[it1].size() == 1) pode = 0;
      if (pode) livres.insert(it);
    }
    segurado[ele].clear();
    for (auto& it : segura[ele]) {
      segurado[it].erase(ele);
      if (segurado[it].size() > 1) continue;
      for (auto& it1 : segurado[it])
        if (livres.find(it1) != livres.end()) livres.erase(it1);
    }
    segura[ele].clear();
  }
  return (ans % MOD);
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(NULL);
  cin >> N;
  for (int i = 0; i < N; i++) {
    cin >> x[i] >> y[i];
    mapa[make_pair(x[i], y[i])] = i;
  }
  for (int i = 0; i < N; i++) {
    if (mapa.count(make_pair(x[i], y[i] + 1)) > 0)
      segura[i].insert(mapa[make_pair(x[i], y[i] + 1)]),
          segurado[mapa[make_pair(x[i], y[i] + 1)]].insert(i);
    if (mapa.count(make_pair(x[i] - 1, y[i] + 1)) > 0)
      segura[i].insert(mapa[{x[i] - 1, y[i] + 1}]),
          segurado[mapa[{x[i] - 1, y[i] + 1}]].insert(i);
    if (mapa.count({x[i] + 1, y[i] + 1}) > 0)
      segura[i].insert(mapa[{x[i] + 1, y[i] + 1}]),
          segurado[mapa[{x[i] + 1, y[i] + 1}]].insert(i);
  }
  for (int i = 0; i < N; i++) {
    bool pode = 1;
    for (auto& it : segura[i])
      if (segurado[it].size() == 1) pode = 0;
    if (pode) livres.insert(i);
  }
  cout << simulate() << endl;
}
