#include <bits/stdc++.h>
using namespace std;
struct node {
  long long a, b;
} te[300010];
bool cmp1(node x, node y) { return x.a < y.a; }
bool cmp2(node x, node y) { return x.b < y.b; }
bool cmp(node x, node y) {
  if (x.a == y.a) return x.b < y.b;
  return x.a < y.a;
}
long long n;
long long jiecheng(long long x) {
  long long an = 1, i;
  for (i = 1; i <= x; i++) {
    an *= i;
    an %= 998244353;
  }
  return an;
}
int main() {
  int i, j;
  scanf("%lld", &n);
  for (i = 1; i <= n; i++) {
    scanf("%lld%lld", &te[i].a, &te[i].b);
  }
  long long sa = 1, sb = 1, ss = 1, all = 1;
  all = jiecheng(n);
  sort(te + 1, te + 1 + n, cmp1);
  long long cnt = 1;
  for (i = 2; i <= n; i++) {
    if (te[i].a != te[i - 1].a) {
      sa *= jiecheng(cnt);
      sa %= 998244353;
      cnt = 1;
    } else
      cnt++;
  }
  sa *= jiecheng(cnt);
  sa %= 998244353;
  cnt = 1;
  sort(te + 1, te + 1 + n, cmp2);
  for (i = 2; i <= n; i++) {
    if (te[i].b != te[i - 1].b) {
      sb *= jiecheng(cnt);
      sb %= 998244353;
      cnt = 1;
    } else
      cnt++;
  }
  sb *= jiecheng(cnt);
  sb %= 998244353;
  cnt = 1;
  sort(te + 1, te + 1 + n, cmp);
  for (i = 2; i <= n; i++)
    if (te[i].b < te[i - 1].b) ss = 0;
  for (i = 2; i <= n; i++) {
    if (te[i].b != te[i - 1].b || te[i].a != te[i - 1].a) {
      ss *= jiecheng(cnt);
      ss %= 998244353;
      cnt = 1;
    } else
      cnt++;
  }
  ss *= jiecheng(cnt);
  ss %= 998244353;
  long long ans = (all - sa - sb + ss + 998244353 + 998244353) % 998244353;
  printf("%lld\n", ans);
  return 0;
}
