#include #include using namespace std; using namespace atcoder; using ll = long long; using mint = modint998244353; using vi = vector; using vvi = vector; using vvvi = vector; using vll = vector; using vvll = vector; using vvvll = vector; using vmi = vector; using vvmi = vector; using vvvmi = vector; #define all(a) (a).begin(), (a).end() #define rep2(i, m, n) for (int i = (m); i < (n); ++i) #define rep(i, n) rep2(i, 0, n) #define drep2(i, m, n) for (int i = (m)-1; i >= (n); --i) #define drep(i, n) drep2(i, n, 0) struct S{ mint s; mint c; }; S op(S a, S b){ return {a.s + b.s, a.c + b.c}; } S e(){return {0, 0};} int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; set st; vll a(n); rep(i, n){ cin >> a[i]; st.insert(a[i]); } map mp; int itr = 0; for(auto i : st){ mp[i] = itr; itr++; } segtree seg1(itr), seg2(itr); seg1.set(mp[a[0]], {mint(a[0]), 1}); rep2(i, 1, n){ S t = seg2.get(mp[a[i]]); seg2.set(mp[a[i]], {t.s + mint(a[i]), t.c + 1}); } mint ans = 0; rep2(i, 1, n-1){ int c = mp[a[i]]; S e = seg2.get(c); seg2.set(c, {e.s - mint(a[i]), e.c - 1}); S l = seg1.prod(c+1, itr), r = seg2.prod(0, c); ans += l.s * r.c + l.c * r.s + mint(a[i])*r.c*l.c; S d = seg1.get(c); seg1.set(c, {d.s + mint(a[i]), d.c + 1}); }cout << ans.val() << endl; return 0; }