func_code_string: #include <bits/stdc++.h>   using namespace std;   inline bool EQ(double a, double b) { return fabs(a - b) < 1e-9; }   const int INF = (((1 << 30) - 1) << 1) + 1;   const int nINF = 1 << 31;   pair<long long, long long> egcd(long long a, long long b,                                   pair<long long, long long> x = {1, 0},                                   pair<long long, long long> y = {0, 1}) {     return (b == 0)                ? x                : egcd(b, a % b, y,                       {x.first - a / b * y.first, x.second - a / b * y.second});   }   long long modInv(long long a, long long n) {     return ((egcd(a, n).first % n) + n) % n;   }   const long long M = 998244353;   long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }   long long mult(long long a, long long b) { return (a * b) % M; }   long long add(long long a, long long b) { return (a + b) % M; }   struct frac {     long long n, d;     void simp() {       long long g = gcd(n, d);       n /= g;       d /= g;     }     frac(long long in_n, long long in_d) {       n = in_n, d = in_d;       simp();     }     frac operator+(frac& oth) {       frac ret(n * oth.d + d * oth.n, d * oth.d);       ret.simp();       return ret;     }   };   const int N = 2e5 + 10;   int n, p[N], m = 0, l[N], have[N];   long long bit[N];   long long getSum(int i) {     long long sum = 0;     ++i;     while (i > 0) {       sum += bit[i];       i -= i & (-i);     }     return sum;   }   void updateBIT(int i, long long val) {     ++i;     while (i <= n + 5) {       bit[i] += val;       i += i & (-i);     }   }   signed main() {     ios::sync_with_stdio(false);     cin >> n;     for (int i = 0; i < (n); i++) {       cin >> p[i];       if (p[i] != -1)         have[p[i]] = 1;       else         ++m;     }     for (int i = (1); i <= (n); i++) {       l[i] = l[i - 1];       if (!have[i]) ++l[i];     }     long long k = 0;     frac einv(0, 1);     frac lm(0, 1);     long long lmi = 0;     long long inv = 0;     long long ans = 0;     for (int i = 0; i < (n); i++) {       int x = p[i];       if (x != -1) {         int above = getSum(n) - getSum(x);         inv += above;         ans = add(ans, above);         updateBIT(x, 1);         if (m) {           frac ex((m - l[x]) * k, m);           frac cex(l[x], m);           einv = einv + ex;           lm = lm + cex;           lmi = add(lmi, mult(cex.n, modInv(cex.d, M)));           ans = add(ans, mult(ex.n, modInv(ex.d, M)));         }       } else {         einv = einv + lm;         ans = add(ans, lmi);         frac ex(k, 2);         einv = einv + ex;         ans = add(ans, mult(ex.n, modInv(ex.d, M)));         ++k;       }     }     frac kinv(inv, 1);     cout << ans << endl;     return 0;   }   