#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
const int MOD = 998244353;
const int N = 3e5 + 5;
// Gọi dp[i] = Đáp án khi xét các phần tử từ a[1] đến a[i]
// dp[i] = tổng{dp[j] * (max{a[j + 1..i]} - min{a[j + 1..i]})} (với j < i)
// = tổng{dp[j] * max{a[j + 1..i]}} - tổng{dp[j] * min{a[j + 1..i]}}
// = A - B
// Ở đây ta sẽ bàn về cách tính A, cách tính B hoàn toàn tương tự
// Khi xét đến i, để tính A ta xét 2 trường hợp:
// Trường hợp 1: a[i] đóng vai trò là max
// - Gọi l[i] = phần tử gần nhất bên trái > a[i]
// - a[i] sẽ đóng vai trò là max trong đoạn [j + 1, i] với l[i] <= j < i
// => A = tổng{dp[j]} * a[i] với j thuộc đoạn [l[i], i - 1]
// => Tối ưu bằng prefix sum
// Trường hợp 2: a[i] không đóng vai trò là max
// => A = sum_max[l[i]]
// sum_max[i] là tổng A ở trường hợp 1 khi xét dãy ..., l[l[i]], l[i], i (đọc code để hiểu rõ hơn sum_max[])
void add(int& a, int b) {
a += b;
if (a >= MOD) a -= MOD;
if (a < 0) a += MOD;
}
int n;
int a[N];
int l[2][N]; // l[0][i] = Phần tử gần nhất bên trái > a[i]
// l[1][i] = Phần tử gần nhất bên trái < a[i]
int dp[N];
int pref[N];
int sum_max[N];
int sum_min[N];
int getSum(int l, int r) {
int ans = pref[r];
if (l > 0) add(ans, -pref[l - 1]);
return ans;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
vector<int> st;
for (int i = 1; i <= n; i++) {
while (!st.empty() && a[st.back()] <= a[i]) st.pop_back();
l[0][i] = st.empty() ? 0 : st.back();
st.push_back(i);
}
st.clear();
for (int i = 1; i <= n; i++) {
while (!st.empty() && a[st.back()] >= a[i]) st.pop_back();
l[1][i] = st.empty() ? 0 : st.back();
st.push_back(i);
}
dp[0] = 1;
pref[0] = 1;
sum_max[0] = sum_min[0] = 0;
for (int i = 1; i <= n; i++) {
// Tính A
int j = l[0][i];
int cur = 1ll * getSum(j, i - 1) * a[i] % MOD;
add(dp[i], cur);
sum_max[i] = cur;
if (j > 0) {
add(dp[i], sum_max[j]);
add(sum_max[i], sum_max[j]);
}
// Tính B
j = l[1][i];
cur = 1ll * getSum(j, i - 1) * a[i] % MOD;
add(dp[i], -cur);
sum_min[i] = cur;
if (j > 0) {
add(dp[i], -sum_min[j]);
add(sum_min[i], sum_min[j]);
}
// Cập nhật prefix sum
pref[i] = pref[i - 1];
add(pref[i], dp[i]);
}
cout << dp[n] << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKY29uc3QgaW50IE1PRCA9IDk5ODI0NDM1MzsgCgpjb25zdCBpbnQgTiA9IDNlNSArIDU7IAoKLy8gR+G7jWkgZHBbaV0gPSDEkMOhcCDDoW4ga2hpIHjDqXQgY8OhYyBwaOG6p24gdOG7rSB04burIGFbMV0gxJHhur9uIGFbaV0KLy8gZHBbaV0gPSB04buVbmd7ZHBbal0gKiAobWF4e2FbaiArIDEuLmldfSAtIG1pbnthW2ogKyAxLi5pXX0pfSAoduG7m2kgaiA8IGkpCi8vICAgICAgID0gdOG7lW5ne2RwW2pdICogbWF4e2FbaiArIDEuLmldfX0gLSB04buVbmd7ZHBbal0gKiBtaW57YVtqICsgMS4uaV19fQovLyAgICAgICA9ICAgICAgICAgICAgICBBICAgICAgICAgICAgICAgICAtICAgICAgICAgICAgICAgQgovLyDhu54gxJHDonkgdGEgc+G6vSBiw6BuIHbhu4EgY8OhY2ggdMOtbmggQSwgY8OhY2ggdMOtbmggQiBob8OgbiB0b8OgbiB0xrDGoW5nIHThu7EKLy8gS2hpIHjDqXQgxJHhur9uIGksIMSR4buDIHTDrW5oIEEgdGEgeMOpdCAyIHRyxrDhu51uZyBo4bujcDoKLy8gVHLGsOG7nW5nIGjhu6NwIDE6IGFbaV0gxJHDs25nIHZhaSB0csOyIGzDoCBtYXgKLy8gLSBH4buNaSBsW2ldID0gcGjhuqduIHThu60gZ+G6p24gbmjhuqV0IGLDqm4gdHLDoWkgPiBhW2ldCi8vIC0gYVtpXSBz4bq9IMSRw7NuZyB2YWkgdHLDsiBsw6AgbWF4IHRyb25nIMSRb+G6oW4gW2ogKyAxLCBpXSB24bubaSBsW2ldIDw9IGogPCBpCi8vID0+IEEgPSB04buVbmd7ZHBbal19ICogYVtpXSB24bubaSBqIHRodeG7mWMgxJFv4bqhbiBbbFtpXSwgaSAtIDFdCi8vID0+IFThu5FpIMawdSBi4bqxbmcgcHJlZml4IHN1bQovLyBUcsaw4budbmcgaOG7o3AgMjogYVtpXSBraMO0bmcgxJHDs25nIHZhaSB0csOyIGzDoCBtYXgKLy8gPT4gQSA9IHN1bV9tYXhbbFtpXV0KLy8gc3VtX21heFtpXSBsw6AgdOG7lW5nIEEg4bufIHRyxrDhu51uZyBo4bujcCAxIGtoaSB4w6l0IGTDo3kgLi4uLCBsW2xbaV1dLCBsW2ldLCBpICjEkeG7jWMgY29kZSDEkeG7gyBoaeG7g3UgcsO1IGjGoW4gc3VtX21heFtdKSAKdm9pZCBhZGQoaW50JiBhLCBpbnQgYikgewoJYSArPSBiOyAKCWlmIChhID49IE1PRCkgYSAtPSBNT0Q7IAoJaWYgKGEgPCAwKSBhICs9IE1PRDsgCn0KCmludCBuOyAKaW50IGFbTl07IAoKaW50IGxbMl1bTl07IC8vIGxbMF1baV0gPSBQaOG6p24gdOG7rSBn4bqnbiBuaOG6pXQgYsOqbiB0csOhaSA+IGFbaV0KCQkJIC8vIGxbMV1baV0gPSBQaOG6p24gdOG7rSBn4bqnbiBuaOG6pXQgYsOqbiB0csOhaSA8IGFbaV0KCmludCBkcFtOXTsKaW50IHByZWZbTl07IAppbnQgc3VtX21heFtOXTsgCmludCBzdW1fbWluW05dOyAKCmludCBnZXRTdW0oaW50IGwsIGludCByKSB7CglpbnQgYW5zID0gcHJlZltyXTsgCglpZiAobCA+IDApIGFkZChhbnMsIC1wcmVmW2wgLSAxXSk7IAoJcmV0dXJuIGFuczsgCn0KCmludCBtYWluKCkgewoJaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyAKCWNpbi50aWUobnVsbHB0cik7IAkKCWNpbiA+PiBuOyAgCglmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIGNpbiA+PiBhW2ldOyAKCgl2ZWN0b3I8aW50PiBzdDsgIAoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CgkJd2hpbGUgKCFzdC5lbXB0eSgpICYmIGFbc3QuYmFjaygpXSA8PSBhW2ldKSBzdC5wb3BfYmFjaygpOyAgCgkJbFswXVtpXSA9IHN0LmVtcHR5KCkgPyAwIDogc3QuYmFjaygpOyAKCQlzdC5wdXNoX2JhY2soaSk7IAoJfQoKCXN0LmNsZWFyKCk7IAoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CgkJd2hpbGUgKCFzdC5lbXB0eSgpICYmIGFbc3QuYmFjaygpXSA+PSBhW2ldKSBzdC5wb3BfYmFjaygpOyAgCgkJbFsxXVtpXSA9IHN0LmVtcHR5KCkgPyAwIDogc3QuYmFjaygpOyAKCQlzdC5wdXNoX2JhY2soaSk7IAoJfQoKCWRwWzBdID0gMTsgCglwcmVmWzBdID0gMTsKCXN1bV9tYXhbMF0gPSBzdW1fbWluWzBdID0gMDsgCgoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CgkJLy8gVMOtbmggQQoJCWludCBqID0gbFswXVtpXTsgCgkJaW50IGN1ciA9IDFsbCAqIGdldFN1bShqLCBpIC0gMSkgKiBhW2ldICUgTU9EOwoJCWFkZChkcFtpXSwgY3VyKTsKCQlzdW1fbWF4W2ldID0gY3VyOyAgCgkJaWYgKGogPiAwKSB7CgkJCWFkZChkcFtpXSwgc3VtX21heFtqXSk7IAoJCQlhZGQoc3VtX21heFtpXSwgc3VtX21heFtqXSk7IAoJCX0KCgkJLy8gVMOtbmggQgoJCWogPSBsWzFdW2ldOyAKCQljdXIgPSAxbGwgKiBnZXRTdW0oaiwgaSAtIDEpICogYVtpXSAlIE1PRDsKCQlhZGQoZHBbaV0sIC1jdXIpOyAgCgkJc3VtX21pbltpXSA9IGN1cjsgCgkJaWYgKGogPiAwKSB7CgkJCWFkZChkcFtpXSwgLXN1bV9taW5bal0pOyAKCQkJYWRkKHN1bV9taW5baV0sIHN1bV9taW5bal0pOyAKCQl9CgoJCS8vIEPhuq1wIG5o4bqtdCBwcmVmaXggc3VtCgkJcHJlZltpXSA9IHByZWZbaSAtIDFdOyAKCQlhZGQocHJlZltpXSwgZHBbaV0pOyAKCX0KCgljb3V0IDw8IGRwW25dIDw8ICdcbic7IAp9