#include using namespace std; const long long MOD = 998244353; template struct invertible_binary_indexed_tree{ int N; vector BIT; function f; function inv; T E; invertible_binary_indexed_tree(int N, function f, function inv, T E): N(N), BIT(N + 1, E), f(f), inv(inv), E(E){ } void add(int i, T x){ i++; while (i <= N){ BIT[i] = f(BIT[i], x); i += i & -i; } } T sum(int i){ T ans = E; while (i > 0){ ans = f(ans, BIT[i]); i -= i & -i; } return ans; } T sum(int l, int r){ return f(sum(r), inv(sum(l))); } }; int main(){ int N; cin >> N; vector P(N); for (int i = 0; i < N; i++){ cin >> P[i]; P[i]--; } vector POW(N); POW[0] = 1; for (int i = 0; i < N - 1; i++){ POW[i + 1] = POW[i] * 2 % MOD; } invertible_binary_indexed_tree BIT1(N, plus(), negate(), 0); auto sum = [](long long x, long long y){ return (x + y) % MOD; }; auto inv = [](long long x){ return (MOD - x) % MOD; }; invertible_binary_indexed_tree BIT2(N, sum, inv, 0); long long ans = 0; for (int i = 0; i < N; i++){ ans += BIT1.sum(P[i] + 1, N) * POW[N - 1] % MOD; ans += MOD - BIT2.sum(P[i] + 1, N) * POW[N - 1 - i] % MOD; ans %= MOD; BIT1.add(P[i], 1); BIT2.add(P[i], POW[i]); } cout << ans << endl; }