#include <bits/stdc++.h>
using namespace std;
template <class T>
void print(T &x) {
  cout << x;
}
template <class T>
void print(vector<T> &v) {
  cout << "{";
  if ((v).size()) print(v[0]);
  for (int i = 1; i < (v).size(); i++) cout << ", ", print(v[i]);
  cout << "}\n";
}
const int N = 105;
int q, k, t, m, n, cs = 1;
const long long mod = 998244353;
long long fact(long long num) {
  return num == 0 ? 1 : num * fact(num - 1) % mod;
}
inline void relax(long long &res) {
  res %= mod;
  res += mod;
  res %= mod;
}
long long ckBoth(vector<pair<int, int> > &pr) {
  sort((pr).begin(), (pr).end());
  for (int i = 1; i < (pr).size(); ++i) {
    if (pr[i].second < pr[i - 1].second) return 0;
  }
  long long res = 1;
  for (int i = 0; i < (pr).size();) {
    int j = i + 1;
    while (pr[i] == pr[j] and j < (pr).size()) j++;
    res = res * fact(j - i);
    relax(res);
    i = j;
  }
  return res;
}
void HalfDead() {
  vector<int> a, b;
  vector<pair<int, int> > pr;
  int x, y;
  cin >> n;
  for (int i = 0; i < (int)n; ++i) {
    cin >> x >> y;
    a.push_back(x);
    b.push_back(y);
    pr.push_back({x, y});
  }
  long long res = fact(n);
  relax(res);
  sort((a).begin(), (a).end());
  sort((b).begin(), (b).end());
  long long r = 1;
  for (int i = 0; i < (a).size();) {
    int j = i + 1;
    while (a[i] == a[j] and j < (a).size()) j++;
    r *= fact(j - i);
    relax(r);
    i = j;
  }
  res -= r;
  relax(res);
  r = 1;
  for (int i = 0; i < (b).size();) {
    int j = i + 1;
    while (b[i] == b[j] and j < (b).size()) j++;
    r *= fact(j - i);
    relax(r);
    i = j;
  }
  res -= r;
  relax(res);
  res += ckBoth(pr);
  relax(res);
  cout << res << "\n";
}
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(nullptr);
  cout.tie(0);
  int tc = 1;
  while (tc--) {
    HalfDead();
  }
  return 0;
}
