#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5, mod = 1e9;
struct node {
int sm, sM, sL, smM, sML, smL, smML;
};
node operator+(node a, node b) {
node c = {a.sm + b.sm, a.sM + b.sM, a.sL + b.sL, a.smM + b.smM,
a.sML + b.sML, a.smL + b.smL, a.smML + b.smML};
return c;
}
struct LZ {
int m, M, l;
};
node t[4 * N];
LZ lz[4 * N];
void downl(int id, int l, int r) {
t[id].sL += 1ll * (lz[id].l * (r - l + 1)) % mod;
t[id].sL %= mod;
t[id].smL += 1ll * t[id].sm * lz[id].l % mod;
t[id].smL %= mod;
t[id].smML += 1ll * t[id].smM * lz[id].l % mod;
if (l != r) {
lz[id * 2].l += lz[id].l;
lz[id * 2 + 1].l += lz[id].l;
lz[id * 2].l %= mod;
lz[id * 2 + 1].l %= mod;
}
lz[id].l = 0;
}
void downm(int id, int l, int r) {
t[id].sm += 1ll * lz[id].m * (r - l + 1) % mod;
t[id].sm %= mod;
t[id].smM += 1ll * t[id].sM * lz[id].m % mod;
t[id].smM %= mod;
t[id].smML += 1ll * t[id].sML * lz[id].m % mod;
t[id].smML %= mod;
if (l != r) {
lz[id * 2].m = lz[id].m;
lz[id * 2 + 1].m = lz[id].m;
}
lz[id].m = 0;
}
void downM(int id, int l, int r) {
t[id].sM += 1ll * lz[id].M * (r - l + 1) % mod;
t[id].sM %= mod;
t[id].smM += 1ll * t[id].sM * lz[id].M % mod;
t[id].sm %= mod;
t[id].smML += 1ll * t[id].smL * lz[id].M % mod;
t[id].smML %= mod;
lz[id].M = 0;
}
void down(int id, int l, int r) {
downl(id, l, r);
if (lz[id].m != 0) downm(id, l, r);
if (lz[id].M != 0) downM(id, l, r);
}
void updatel(int id, int l, int r, int u, int v, int x) {
down(id, l, r);
if (r < u || v < l) return;
if (u <= l && r <= v) {
lz[id].l += x;
down(id, l, r);
return;
}
updatel(id * 2, l, (l + r) / 2, u, v, x);
updatel(id * 2 + 1, (l + r) / 2 + 1, r, u, v, x);
t[id] = t[id * 2] + t[id * 2 + 1];
}
void updatem(int id, int l, int r, int u, int v, int x) {
down(id, l, r);
if (r < u || v < l) return;
if (u <= l && r <= v) {
lz[id].m = x;
down(id, l, r);
return;
}
updatem(id * 2, l, (l + r) / 2, u, v, x);
updatem(id * 2 + 1, (l + r) / 2 + 1, r, u, v, x);
t[id] = t[id * 2] + t[id * 2 + 1];
}
void updateM(int id, int l, int r, int u, int v, int x) {
down(id, l, r);
if (r < u || v < l) return;
if (u <= l && r <= v) {
lz[id].M = x;
down(id, l, r);
return;
}
updateM(id * 2, l, (l + r) / 2, u, v, x);
updateM(id * 2 + 1, (l + r) / 2 + 1, r, u, v, x);
t[id] = t[id * 2] + t[id * 2 + 1];
}
int get(int id, int l, int r, int u, int v) {
down(id, l, r);
if (r < u || v < l) return 0;
if (u <= l && r <= v) return t[id].smML;
return (get(id * 2, l, (l + r) / 2, u, v) +
get(id * 2 + 1, (l + r) / 2 + 1, r, u, v)) %
mod;
}
int a[N];
signed main() {
int n, pm, pM;
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
stack<int> sm, sM;
int res = 0;
for (int i = 1; i <= n; i++) {
while (sm.size() && a[sm.top()] <= a[i]) sm.pop();
if (sm.empty())
pm = i;
else
pm = sm.top();
sm.push(i);
while (sM.size() && a[sM.top()] >= a[i]) sM.pop();
if (sM.empty())
pM = i;
else
pM = sM.top();
sM.push(i);
updatel(1, 1, n, 1, i, 1);
updatem(1, 1, n, pm, i, a[i]);
updateM(1, 1, n, pM, i, a[i]);
res += get(1, 1, n, 1, i);
res %= mod;
}
cout << res;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmNvbnN0IGludCBOID0gNWU1ICsgNSwgbW9kID0gMWU5OwpzdHJ1Y3Qgbm9kZSB7CiAgICBpbnQgc20sIHNNLCBzTCwgc21NLCBzTUwsIHNtTCwgc21NTDsKfTsKbm9kZSBvcGVyYXRvcisobm9kZSBhLCBub2RlIGIpIHsKICAgIG5vZGUgYyA9IHthLnNtICsgYi5zbSwgICBhLnNNICsgYi5zTSwgICBhLnNMICsgYi5zTCwgICAgYS5zbU0gKyBiLnNtTSwKICAgICAgICAgICAgICBhLnNNTCArIGIuc01MLCBhLnNtTCArIGIuc21MLCBhLnNtTUwgKyBiLnNtTUx9OwogICAgcmV0dXJuIGM7Cn0Kc3RydWN0IExaIHsKICAgIGludCBtLCBNLCBsOwp9Owpub2RlIHRbNCAqIE5dOwpMWiBsels0ICogTl07CnZvaWQgZG93bmwoaW50IGlkLCBpbnQgbCwgaW50IHIpIHsKICAgIHRbaWRdLnNMICs9IDFsbCAqIChseltpZF0ubCAqIChyIC0gbCArIDEpKSAlIG1vZDsKICAgIHRbaWRdLnNMICU9IG1vZDsKICAgIHRbaWRdLnNtTCArPSAxbGwgKiB0W2lkXS5zbSAqIGx6W2lkXS5sICUgbW9kOwogICAgdFtpZF0uc21MICU9IG1vZDsKICAgIHRbaWRdLnNtTUwgKz0gMWxsICogdFtpZF0uc21NICogbHpbaWRdLmwgJSBtb2Q7CiAgICBpZiAobCAhPSByKSB7CiAgICAgICAgbHpbaWQgKiAyXS5sICs9IGx6W2lkXS5sOwogICAgICAgIGx6W2lkICogMiArIDFdLmwgKz0gbHpbaWRdLmw7CiAgICAgICAgbHpbaWQgKiAyXS5sICU9IG1vZDsKICAgICAgICBseltpZCAqIDIgKyAxXS5sICU9IG1vZDsKICAgIH0KICAgIGx6W2lkXS5sID0gMDsKfQp2b2lkIGRvd25tKGludCBpZCwgaW50IGwsIGludCByKSB7CiAgICB0W2lkXS5zbSArPSAxbGwgKiBseltpZF0ubSAqIChyIC0gbCArIDEpICUgbW9kOwogICAgdFtpZF0uc20gJT0gbW9kOwogICAgdFtpZF0uc21NICs9IDFsbCAqIHRbaWRdLnNNICogbHpbaWRdLm0gJSBtb2Q7CiAgICB0W2lkXS5zbU0gJT0gbW9kOwogICAgdFtpZF0uc21NTCArPSAxbGwgKiB0W2lkXS5zTUwgKiBseltpZF0ubSAlIG1vZDsKICAgIHRbaWRdLnNtTUwgJT0gbW9kOwogICAgaWYgKGwgIT0gcikgewogICAgICAgIGx6W2lkICogMl0ubSA9IGx6W2lkXS5tOwogICAgICAgIGx6W2lkICogMiArIDFdLm0gPSBseltpZF0ubTsKICAgIH0KICAgIGx6W2lkXS5tID0gMDsKfQp2b2lkIGRvd25NKGludCBpZCwgaW50IGwsIGludCByKSB7CiAgICB0W2lkXS5zTSArPSAxbGwgKiBseltpZF0uTSAqIChyIC0gbCArIDEpICUgbW9kOwogICAgdFtpZF0uc00gJT0gbW9kOwogICAgdFtpZF0uc21NICs9IDFsbCAqIHRbaWRdLnNNICogbHpbaWRdLk0gJSBtb2Q7CiAgICB0W2lkXS5zbSAlPSBtb2Q7CiAgICB0W2lkXS5zbU1MICs9IDFsbCAqIHRbaWRdLnNtTCAqIGx6W2lkXS5NICUgbW9kOwogICAgdFtpZF0uc21NTCAlPSBtb2Q7CiAgICBseltpZF0uTSA9IDA7Cn0Kdm9pZCBkb3duKGludCBpZCwgaW50IGwsIGludCByKSB7CiAgICBkb3dubChpZCwgbCwgcik7CiAgICBpZiAobHpbaWRdLm0gIT0gMCkgZG93bm0oaWQsIGwsIHIpOwogICAgaWYgKGx6W2lkXS5NICE9IDApIGRvd25NKGlkLCBsLCByKTsKfQp2b2lkIHVwZGF0ZWwoaW50IGlkLCBpbnQgbCwgaW50IHIsIGludCB1LCBpbnQgdiwgaW50IHgpIHsKICAgIGRvd24oaWQsIGwsIHIpOwogICAgaWYgKHIgPCB1IHx8IHYgPCBsKSByZXR1cm47CiAgICBpZiAodSA8PSBsICYmIHIgPD0gdikgewogICAgICAgIGx6W2lkXS5sICs9IHg7CiAgICAgICAgZG93bihpZCwgbCwgcik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgdXBkYXRlbChpZCAqIDIsIGwsIChsICsgcikgLyAyLCB1LCB2LCB4KTsKICAgIHVwZGF0ZWwoaWQgKiAyICsgMSwgKGwgKyByKSAvIDIgKyAxLCByLCB1LCB2LCB4KTsKICAgIHRbaWRdID0gdFtpZCAqIDJdICsgdFtpZCAqIDIgKyAxXTsKfQp2b2lkIHVwZGF0ZW0oaW50IGlkLCBpbnQgbCwgaW50IHIsIGludCB1LCBpbnQgdiwgaW50IHgpIHsKICAgIGRvd24oaWQsIGwsIHIpOwogICAgaWYgKHIgPCB1IHx8IHYgPCBsKSByZXR1cm47CiAgICBpZiAodSA8PSBsICYmIHIgPD0gdikgewogICAgICAgIGx6W2lkXS5tID0geDsKICAgICAgICBkb3duKGlkLCBsLCByKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICB1cGRhdGVtKGlkICogMiwgbCwgKGwgKyByKSAvIDIsIHUsIHYsIHgpOwogICAgdXBkYXRlbShpZCAqIDIgKyAxLCAobCArIHIpIC8gMiArIDEsIHIsIHUsIHYsIHgpOwogICAgdFtpZF0gPSB0W2lkICogMl0gKyB0W2lkICogMiArIDFdOwp9CnZvaWQgdXBkYXRlTShpbnQgaWQsIGludCBsLCBpbnQgciwgaW50IHUsIGludCB2LCBpbnQgeCkgewogICAgZG93bihpZCwgbCwgcik7CiAgICBpZiAociA8IHUgfHwgdiA8IGwpIHJldHVybjsKICAgIGlmICh1IDw9IGwgJiYgciA8PSB2KSB7CiAgICAgICAgbHpbaWRdLk0gPSB4OwogICAgICAgIGRvd24oaWQsIGwsIHIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHVwZGF0ZU0oaWQgKiAyLCBsLCAobCArIHIpIC8gMiwgdSwgdiwgeCk7CiAgICB1cGRhdGVNKGlkICogMiArIDEsIChsICsgcikgLyAyICsgMSwgciwgdSwgdiwgeCk7CiAgICB0W2lkXSA9IHRbaWQgKiAyXSArIHRbaWQgKiAyICsgMV07Cn0KaW50IGdldChpbnQgaWQsIGludCBsLCBpbnQgciwgaW50IHUsIGludCB2KSB7CiAgICBkb3duKGlkLCBsLCByKTsKICAgIGlmIChyIDwgdSB8fCB2IDwgbCkgcmV0dXJuIDA7CiAgICBpZiAodSA8PSBsICYmIHIgPD0gdikgcmV0dXJuIHRbaWRdLnNtTUw7CiAgICByZXR1cm4gKGdldChpZCAqIDIsIGwsIChsICsgcikgLyAyLCB1LCB2KSArCiAgICAgICAgICAgIGdldChpZCAqIDIgKyAxLCAobCArIHIpIC8gMiArIDEsIHIsIHUsIHYpKSAlCiAgICAgICAgICAgbW9kOwp9CmludCBhW05dOwpzaWduZWQgbWFpbigpIHsKICAgIGludCBuLCBwbSwgcE07CiAgICBjaW4gPj4gbjsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgY2luID4+IGFbaV07CiAgICBzdGFjazxpbnQ+IHNtLCBzTTsKICAgIGludCByZXMgPSAwOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CiAgICAgICAgd2hpbGUgKHNtLnNpemUoKSAmJiBhW3NtLnRvcCgpXSA8PSBhW2ldKSBzbS5wb3AoKTsKICAgICAgICBpZiAoc20uZW1wdHkoKSkKICAgICAgICAgICAgcG0gPSBpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgcG0gPSBzbS50b3AoKTsKICAgICAgICBzbS5wdXNoKGkpOwogICAgICAgIHdoaWxlIChzTS5zaXplKCkgJiYgYVtzTS50b3AoKV0gPj0gYVtpXSkgc00ucG9wKCk7CiAgICAgICAgaWYgKHNNLmVtcHR5KCkpCiAgICAgICAgICAgIHBNID0gaTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHBNID0gc00udG9wKCk7CiAgICAgICAgc00ucHVzaChpKTsKICAgICAgICB1cGRhdGVsKDEsIDEsIG4sIDEsIGksIDEpOwogICAgICAgIHVwZGF0ZW0oMSwgMSwgbiwgcG0sIGksIGFbaV0pOwogICAgICAgIHVwZGF0ZU0oMSwgMSwgbiwgcE0sIGksIGFbaV0pOwogICAgICAgIHJlcyArPSBnZXQoMSwgMSwgbiwgMSwgaSk7CiAgICAgICAgcmVzICU9IG1vZDsKICAgIH0KICAgIGNvdXQgPDwgcmVzOwp9