#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5;
long long fact[maxn + 10], mod = 998244353;
pair<int, int> niz[maxn + 10];
int n;
map<int, int> mapa1, mapa2;
map<pair<int, int>, int> mapa12;
bool srt(pair<int, int> a, pair<int, int> b) {
  return (a.first < b.first) || (a.first == b.first && a.second < b.second);
}
bool check() {
  sort(niz + 1, niz + n + 1, srt);
  for (int i = 1; i < n; i++)
    if (niz[i].first <= niz[i + 1].first && niz[i].second <= niz[i + 1].second)
      continue;
    else
      return false;
  return true;
}
int main() {
  fact[0] = 1;
  for (int i = 1; i <= maxn; i++) fact[i] = (fact[i - 1] * i) % mod;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    int a, b;
    scanf("%d %d", &a, &b);
    niz[i] = {a, b};
    mapa1[a]++;
    mapa2[b]++;
    mapa12[{a, b}]++;
  }
  long long rez1 = 1;
  for (map<int, int>::iterator it = mapa1.begin(); it != mapa1.end(); it++)
    rez1 = (rez1 * fact[it->second]) % mod;
  long long rez2 = 1;
  for (map<int, int>::iterator it = mapa2.begin(); it != mapa2.end(); it++)
    rez2 = (rez2 * fact[it->second]) % mod;
  long long rez12 = 1;
  for (map<pair<int, int>, int>::iterator it = mapa12.begin();
       it != mapa12.end(); it++)
    rez12 = (rez12 * fact[it->second]) % mod;
  long long rez = 0;
  if (check()) {
    rez = (rez1 + rez2 - rez12) % mod;
    if (rez < 0) rez += mod;
    rez = (fact[n] - rez) % mod;
    if (rez < 0) rez += mod;
    printf("%lld\n", rez);
  } else {
    rez = (rez1 + rez2) % mod;
    rez = (fact[n] - rez) % mod;
    if (rez < 0) rez += mod;
    printf("%lld\n", rez);
  }
  return 0;
}
