#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;
}
