#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
// - Đây là một bài tương đối đơn giản, ta chỉ cần nghĩ ra thuật O(n^2), sau đó tối ưu lên bằng CTDL (Fenwick Tree, Segment Tree,...)
// - Gọi beg, last lần lượt là vị trí của phần tử nằm ở đầu và cuối của dãy con
// - Nhận xét: để dãy con thoả mãn thì ta chỉ cần a[beg] <= a[last], còn các phần tử nằm giữa beg và last không quan trọng
// => Gọi số phần tử nằm giữa beg và last là cnt => cnt = last - beg - 1
// => Khi đó ta có 2^cnt cách chọn các phần tử nằm giữa beg và last trong dãy con
// - Phân tích 2^cnt = 2^(last - beg - 1) = 2^last / 2^(beg + 1)
// => Với mỗi last, đặt sum_beg = tổng các 1 / 2^(beg + 1) (với beg < last và a[beg] <= a[last])
// => ans += 2^last * sum_beg
// => Việc tính nhanh sum_beg có thể dùng Fenwick Tree / Segment Tree
// => O(nlogn)
const int N = 3e5 + 5;
const int MOD = 998244353;
int n;
int a[N];
int pow2[N]; // pow2[i] = 2^i % MOD
int inv_pow2[N]; // inv_pow2[i] = Nghịch đảo modulo của 2^i
void compress(int a[]) {
vector<int> vals;
for (int i = 1; i <= n; i++) vals.push_back(a[i]);
sort(vals.begin(), vals.end());
vals.resize(unique(vals.begin(), vals.end()) - vals.begin());
for (int i = 1; i <= n; i++) {
a[i] = lower_bound(vals.begin(), vals.end(), a[i]) - vals.begin() + 1;
}
}
void add(int& a, int b) {
a += b;
if (a >= MOD) a -= MOD;
}
int binpow(int a, int b) {
int ans = 1;
for (; b > 0; b >>= 1) {
if (b & 1) ans = 1ll * ans * a % MOD;
a = 1ll * a * a % MOD;
}
return ans;
}
struct Fenwick {
int n;
vector<int> ft;
Fenwick(int n) : n(n) {
ft.resize(n, 0);
}
void update(int pos, int val) {
for (; pos < n; pos += pos & (-pos)) {
add(ft[pos], val);
}
}
int get(int pos) {
int ans = 0;
for (; pos > 0; pos -= pos & (-pos)) {
add(ans, ft[pos]);
}
return ans;
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
compress(a);
pow2[0] = 1;
for (int i = 1; i <= n; i++) {
pow2[i] = 2ll * pow2[i - 1] % MOD;
}
inv_pow2[n] = binpow(pow2[n], MOD - 2);
for (int i = n - 1; i >= 0; i--) {
inv_pow2[i] = 2ll * inv_pow2[i + 1] % MOD;
}
// int ans = 0;
// for (int last = 1; last <= n; last++) {
// for (int beg = 1; beg < last; beg++) {
// if (a[beg] <= a[last]) {
// add(ans, pow2[last - beg - 1]);
// }
// }
// } // O(n^2)
int ans = 0;
Fenwick fenw(n + 1);
for (int last = 1; last <= n; last++) {
add(ans, 1ll * pow2[last] * fenw.get(a[last]) % MOD);
fenw.update(a[last], inv_pow2[last + 1]);
} // O(nlogn)
cout << ans << '\n';
}