#pragma GCC target("avx2") #pragma GCC optimize("Ofast") #pragma GCC optimize("unroll-loops") #include using namespace std; using ll = long long int; using ull = unsigned long long int; using ld = long double; ll MOD = 998244353; ll modpow(ll A,ll B,ll M){ ll r = 1,p = A; while(B > 0){ if(B % 2 == 1) r = (r * p) % M; p = (p * p) % M; B /= 2; } return r; } vector fac,finv,inv; void COMinit(ll n = 1000000){ fac.resize(n); finv.resize(n); inv.resize(n); inv[1] = 1; fac[0] = fac[1] = 1; finv[0] = finv[1] = 1; ll i; for(i = 2;i < n;i++){ fac[i] = (fac[i - 1] * i) % MOD; inv[i] = MOD - ((inv[MOD % i] * (MOD / i)) % MOD); finv[i] = (finv[i - 1] * inv[i]) % MOD; } } ll COM(ll n,ll m){ //nCm if(n < m) return 0; if(n < 0 || m < 0) return 0; return (fac[n] * (finv[m] * finv[n - m] % MOD)) % MOD; } ll f(ll a,ll b){ return COM(a + b,a); } struct BIT{ ll n; vector A; BIT(ll N):A(N + 1,0){ n = N; } void add(ll i,ll x){ i++; for(;i <= n;i += i & -i) A[i] += x; } ll query(ll x){ x++; ll r = 0; for(;x > 0;x -= x & -x) r += A[x]; return r; } ll query(ll l,ll r){ return query(r - 1) - query(l - 1); } }; int main(){ COMinit(); ios::sync_with_stdio(false); cin.tie(nullptr); ll N,M; cin >> N >> M; ll L = N - M; ll kari = ((L) * (L - 1)) % MOD; kari *= inv[4]; kari %= MOD; kari *= fac[L]; kari %= MOD; vector A(N,1),B(N),C(N,1),D(N),g; vector> F; for(ll i = 0;i < M;i++){ ll p,k; cin >> p >> k; p--; k--; A[k] = 0; D[k] = p; C[p] = 0; } B[N - 1] = 0; for(ll i = N - 2;i >= 0;i--){ B[i] = B[i + 1] + A[i + 1]; } for(ll i = 0;i < N;i++){ if(C[i] == 1) g.emplace_back(i); } for(ll i = 0;i < N;i++){ if(A[i] == 0){ // calc { ll ans = lower_bound(g.begin(),g.end(),D[i]) - g.begin(); ans *= inv[(ll)g.size()]; ans %= MOD; ans *= B[i]; ans %= MOD; ans *= fac[L]; ans %= MOD; kari += ans; } { ll ans = (ll)g.size() - (lower_bound(g.begin(),g.end(),D[i]) - g.begin()); ans *= inv[(ll)g.size()]; ans %= MOD; ans *= (L - B[i]); ans %= MOD; ans *= fac[L]; ans %= MOD; kari += ans; } } } vector T; for(ll i = 0;i < N;i++){ if(A[i] == 0) T.emplace_back(D[i]); } ll kari2 = 0; BIT tree(200000); for(ll i = 0;i < (ll)T.size();i++){ ll p = T[i]; ll k = tree.query(p + 1,200000); kari2 += k; kari2 %= MOD; tree.add(p,1); } kari2 *= fac[L]; kari2 %= MOD; cout << (kari + kari2) % MOD << endl; }