#include <bits/stdc++.h>
using namespace std;
int x[100010], y[100010];
map<int, map<int, int> > indice;
map<int, map<int, int> > existe;
int m;
int ent[100010];
int sai[100010];
int dx[3] = {-1, 0, 1};
int dy[3] = {-1, -1, -1};
int vis[100010];
struct ComparaMaior {
  bool operator()(int a, int b) { return a < b; }
};
struct ComparaMenor {
  bool operator()(int a, int b) { return a > b; }
};
priority_queue<int, vector<int>, ComparaMaior> filaMaior;
priority_queue<int, vector<int>, ComparaMenor> filaMenor;
int main() {
  scanf("%d", &m);
  int i, j;
  for (i = 0; i < m; i++) {
    scanf("%d %d", &x[i], &y[i]);
    indice[x[i]][y[i]] = i;
    existe[x[i]][y[i]] = 1;
  }
  int novoX, novoY;
  for (i = 0; i < m; i++) {
    for (j = 0; j < 3; j++) {
      novoX = x[i] + dx[j];
      novoY = y[i] + dy[j];
      if (existe[novoX][novoY] == 1) {
        ent[indice[novoX][novoY]]++;
        sai[indice[x[i]][y[i]]]++;
      }
    }
  }
  int pode;
  for (i = 0; i < m; i++) {
    if (ent[i] == 0) {
      filaMaior.push(i);
      filaMenor.push(i);
    } else {
      pode = 1;
      for (j = 0; j < 3; j++) {
        novoX = x[i] + dx[j];
        novoY = y[i] - dy[j];
        if (existe[novoX][novoY] == 1 && sai[indice[novoX][novoY]] <= 1) {
          pode = 0;
          break;
        }
      }
      if (pode == 1) {
        filaMaior.push(i);
        filaMenor.push(i);
      }
    }
  }
  long long res = 0;
  int atual = 0;
  while (1) {
    int no;
    if (atual == 0) {
      while (!filaMaior.empty() && vis[filaMaior.top()] == 1) {
        filaMaior.pop();
      }
      if (filaMaior.empty()) {
        break;
      } else {
        no = filaMaior.top();
        filaMaior.pop();
        if (ent[no] == 0) {
        } else {
          pode = 1;
          for (i = 0; i < 3; i++) {
            novoX = x[no] + dx[i];
            novoY = y[no] - dy[i];
            if (existe[novoX][novoY] == 1 && sai[indice[novoX][novoY]] <= 1) {
              pode = 0;
              break;
            }
          }
          if (pode == 0) {
            continue;
          }
        }
        atual = 1 - atual;
      }
    } else {
      while (!filaMenor.empty() && vis[filaMenor.top()] == 1) {
        filaMenor.pop();
      }
      if (filaMenor.empty()) {
        break;
      } else {
        no = filaMenor.top();
        filaMenor.pop();
        if (ent[no] == 0) {
        } else {
          pode = 1;
          for (i = 0; i < 3; i++) {
            novoX = x[no] + dx[i];
            novoY = y[no] - dy[i];
            if (existe[novoX][novoY] == 1 && sai[indice[novoX][novoY]] <= 1) {
              pode = 0;
              break;
            }
          }
          if (pode == 0) {
            continue;
          }
        }
        atual = 1 - atual;
      }
    }
    if (vis[no] == 0) {
      vis[no] = 1;
      existe[x[no]][y[no]] = 0;
      res = (res * m + no) % 1000000009;
      for (i = 0; i < 3; i++) {
        novoX = x[no] + dx[i];
        novoY = y[no] + dy[i];
        if (existe[novoX][novoY] == 1) {
          int pos = indice[novoX][novoY];
          ent[pos]--;
          if (ent[pos] == 0) {
            filaMaior.push(pos);
            filaMenor.push(pos);
          } else {
            pode = 1;
            for (j = 0; j < 3; j++) {
              int adjX = novoX + dx[j];
              int adjY = novoY - dy[j];
              if (existe[adjX][adjY] == 1 && sai[indice[adjX][adjY]] <= 1) {
                pode = 0;
                break;
              }
            }
            if (pode == 1) {
              int pos = indice[novoX][novoY];
              filaMaior.push(pos);
              filaMenor.push(pos);
            }
          }
        }
      }
      for (i = 0; i < 3; i++) {
        novoX = x[no] + dx[i];
        novoY = y[no] - dy[i];
        if (existe[novoX][novoY] == 1) {
          sai[indice[novoX][novoY]]--;
          pode = 1;
          for (j = 0; j < 3; j++) {
            int adjX, adjY;
            adjX = novoX + dx[j];
            adjY = novoY - dy[j];
            if (existe[adjX][adjY] == 1 && sai[indice[adjX][adjY]] <= 1) {
              pode = 0;
            }
          }
          if (pode == 1) {
            int pos = indice[novoX][novoY];
            filaMaior.push(pos);
            filaMenor.push(pos);
          }
        }
      }
    }
  }
  printf("%I64d\n", res);
  return 0;
}
