func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MAXN = 1000 * 100 * 3 + 10;   long long int mod = 998244353;   long long int x[MAXN];   long long int y[MAXN];   pair<long long int, long long int> p[MAXN];   long long int f(long long int n) {     long long int m = 1;     for (int i = 1; i <= n; i++) {       m *= i % mod;       m = m % mod;     }     return m % mod;   }   int main() {     ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);     int n;     cin >> n;     for (int i = 0; i < n; i++) {       cin >> x[i] >> y[i];       p[i].first = x[i];       p[i].second = y[i];     }     sort(x, x + n);     sort(y, y + n);     sort(p, p + n);     long long int k1 = 1;     long long int k2 = 1;     long long int c = 1;     for (int i = 0; i < n - 1; i++) {       long long int t = i, cnt = 1;       bool bol = false;       while (i < n && x[t] == x[i + 1]) {         bol = true;         cnt++;         i++;       }       if (bol) {         i--;       }       k1 *= f(cnt);       k1 = k1 % mod;     }     for (int i = 0; i < n - 1; i++) {       long long int t = i, cnt = 1;       bool bol = false;       while (i < n && y[t] == y[i + 1]) {         bol = true;         cnt++;         i++;       }       if (bol) {         i--;       }       k2 *= f(cnt);       k2 = k2 % mod;     }     bool fl = false;     for (int i = 1; i < n; i++) {       if (p[i].second < p[i - 1].second) {         fl = true;       }     }     if (fl) {       c = 0;     } else {       for (int i = 0; i < n - 1; i++) {         long long int t = i, cnt = 1;         bool bol = false;         while (i < n && p[t].first == p[i + 1].first &&                p[t].second == p[i + 1].second) {           bol = true;           cnt++;           i++;         }         if (bol) {           i--;         }         c *= f(cnt);         c = c % mod;       }     }     cout << ((f(n) % mod - (k1 + k2) % mod + mod) % mod + c % mod) % mod << endl;     return 0;   }   