#include <bits/stdc++.h>
using namespace std;
const long long mo = 1e9 + 7;
int a[1000007], n, q;
long long st[4000007], st_2[4000007], st_3[4000007];
long long lz[4000007];
int nxt[1000007], f[1000007];
inline void apply(int id, int len, long long x) {
x %= mo;
if (x < 0) x += mo;
long long x2 = x * x % mo;
long long x3 = x2 * x % mo;
st_3[id] = (
st_3[id]
+ 3LL * st_2[id] % mo * x
+ 3LL * st[id] % mo * x2
+ 1LL * len * x3
) % mo;
st_2[id] = (
st_2[id]
+ 2LL * st[id] % mo * x
+ 1LL * len * x2
) % mo;
st[id] = (st[id] + 1LL * len * x) % mo;
lz[id] += x;
if (lz[id] >= mo) lz[id] -= mo;
}
void build(int id, int l, int r) {
if (l == r) {
st[id] = a[l] % mo;
st_2[id] = 1LL * a[l] * a[l] % mo;
st_3[id] = st_2[id] * a[l] % mo;
return;
}
int g = (l + r) >> 1;
build(id << 1, l, g);
build(id << 1 | 1, g + 1, r);
st[id] = (st[id << 1] + st[id << 1 | 1]) % mo;
st_2[id] = (st_2[id << 1] + st_2[id << 1 | 1]) % mo;
st_3[id] = (st_3[id << 1] + st_3[id << 1 | 1]) % mo;
}
void down(int id, int l, int r) {
if (l == r || lz[id] == 0) return;
int g = (l + r) >> 1;
apply(id << 1, g - l + 1, lz[id]);
apply(id << 1 | 1, r - g, lz[id]);
lz[id] = 0;
}
void up(int id, int l, int r, int u, int v, long long x) {
if (l > v || r < u) return;
if (l >= u && r <= v) {
apply(id, r - l + 1, x);
return;
}
down(id, l, r);
int g = (l + r) >> 1;
up(id << 1, l, g, u, v, x);
up(id << 1 | 1, g + 1, r, u, v, x);
st[id] = (st[id << 1] + st[id << 1 | 1]) % mo;
st_2[id] = (st_2[id << 1] + st_2[id << 1 | 1]) % mo;
st_3[id] = (st_3[id << 1] + st_3[id << 1 | 1]) % mo;
}
long long get(int id, int l, int r, int u, int v) {
if (l > v || r < u) return 0;
if (l >= u && r <= v) {
return st[id];
}
down(id, l, r);
int g = (l + r) >> 1;
return (
get(id << 1, l, g, u, v)
+ get(id << 1 | 1, g + 1, r, u, v)
) % mo;
}
int32_t main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = n; i > 0; i--) {
nxt[i] = f[a[i]];
f[a[i]] = i;
}
for (int i = 1; i <= n; i++) {
f[a[i]] = 0;
}
for (int i = 1; i <= n; i++) {
if (!f[a[i]]) {
up(1, 1, n, i, n, 1);
}
f[a[i]] = 1;
}
long long ans = 0;
for (int i = 1; i <= n; i++) {
ans += st_3[1];
ans %= mo;
up(1, 1, n, i, n, -1);
if (nxt[i] != 0) {
up(1, 1, n, nxt[i], n, 1);
}
}
cout << ans;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBsb25nIGxvbmcgbW8gPSAxZTkgKyA3OwoKaW50IGFbMTAwMDAwN10sIG4sIHE7CmxvbmcgbG9uZyBzdFs0MDAwMDA3XSwgc3RfMls0MDAwMDA3XSwgc3RfM1s0MDAwMDA3XTsKbG9uZyBsb25nIGx6WzQwMDAwMDddOwoKaW50IG54dFsxMDAwMDA3XSwgZlsxMDAwMDA3XTsKCmlubGluZSB2b2lkIGFwcGx5KGludCBpZCwgaW50IGxlbiwgbG9uZyBsb25nIHgpIHsKICAgIHggJT0gbW87CiAgICBpZiAoeCA8IDApIHggKz0gbW87CgogICAgbG9uZyBsb25nIHgyID0geCAqIHggJSBtbzsKICAgIGxvbmcgbG9uZyB4MyA9IHgyICogeCAlIG1vOwoKICAgIHN0XzNbaWRdID0gKAogICAgICAgIHN0XzNbaWRdCiAgICAgICAgKyAzTEwgKiBzdF8yW2lkXSAlIG1vICogeAogICAgICAgICsgM0xMICogc3RbaWRdICUgbW8gKiB4MgogICAgICAgICsgMUxMICogbGVuICogeDMKICAgICkgJSBtbzsKCiAgICBzdF8yW2lkXSA9ICgKICAgICAgICBzdF8yW2lkXQogICAgICAgICsgMkxMICogc3RbaWRdICUgbW8gKiB4CiAgICAgICAgKyAxTEwgKiBsZW4gKiB4MgogICAgKSAlIG1vOwoKICAgIHN0W2lkXSA9IChzdFtpZF0gKyAxTEwgKiBsZW4gKiB4KSAlIG1vOwoKICAgIGx6W2lkXSArPSB4OwogICAgaWYgKGx6W2lkXSA+PSBtbykgbHpbaWRdIC09IG1vOwp9Cgp2b2lkIGJ1aWxkKGludCBpZCwgaW50IGwsIGludCByKSB7CiAgICBpZiAobCA9PSByKSB7CiAgICAgICAgc3RbaWRdID0gYVtsXSAlIG1vOwogICAgICAgIHN0XzJbaWRdID0gMUxMICogYVtsXSAqIGFbbF0gJSBtbzsKICAgICAgICBzdF8zW2lkXSA9IHN0XzJbaWRdICogYVtsXSAlIG1vOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpbnQgZyA9IChsICsgcikgPj4gMTsKCiAgICBidWlsZChpZCA8PCAxLCBsLCBnKTsKICAgIGJ1aWxkKGlkIDw8IDEgfCAxLCBnICsgMSwgcik7CgogICAgc3RbaWRdID0gKHN0W2lkIDw8IDFdICsgc3RbaWQgPDwgMSB8IDFdKSAlIG1vOwogICAgc3RfMltpZF0gPSAoc3RfMltpZCA8PCAxXSArIHN0XzJbaWQgPDwgMSB8IDFdKSAlIG1vOwogICAgc3RfM1tpZF0gPSAoc3RfM1tpZCA8PCAxXSArIHN0XzNbaWQgPDwgMSB8IDFdKSAlIG1vOwp9Cgp2b2lkIGRvd24oaW50IGlkLCBpbnQgbCwgaW50IHIpIHsKICAgIGlmIChsID09IHIgfHwgbHpbaWRdID09IDApIHJldHVybjsKCiAgICBpbnQgZyA9IChsICsgcikgPj4gMTsKCiAgICBhcHBseShpZCA8PCAxLCBnIC0gbCArIDEsIGx6W2lkXSk7CiAgICBhcHBseShpZCA8PCAxIHwgMSwgciAtIGcsIGx6W2lkXSk7CgogICAgbHpbaWRdID0gMDsKfQoKdm9pZCB1cChpbnQgaWQsIGludCBsLCBpbnQgciwgaW50IHUsIGludCB2LCBsb25nIGxvbmcgeCkgewogICAgaWYgKGwgPiB2IHx8IHIgPCB1KSByZXR1cm47CgogICAgaWYgKGwgPj0gdSAmJiByIDw9IHYpIHsKICAgICAgICBhcHBseShpZCwgciAtIGwgKyAxLCB4KTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgZG93bihpZCwgbCwgcik7CgogICAgaW50IGcgPSAobCArIHIpID4+IDE7CgogICAgdXAoaWQgPDwgMSwgbCwgZywgdSwgdiwgeCk7CiAgICB1cChpZCA8PCAxIHwgMSwgZyArIDEsIHIsIHUsIHYsIHgpOwoKICAgIHN0W2lkXSA9IChzdFtpZCA8PCAxXSArIHN0W2lkIDw8IDEgfCAxXSkgJSBtbzsKICAgIHN0XzJbaWRdID0gKHN0XzJbaWQgPDwgMV0gKyBzdF8yW2lkIDw8IDEgfCAxXSkgJSBtbzsKICAgIHN0XzNbaWRdID0gKHN0XzNbaWQgPDwgMV0gKyBzdF8zW2lkIDw8IDEgfCAxXSkgJSBtbzsKfQoKbG9uZyBsb25nIGdldChpbnQgaWQsIGludCBsLCBpbnQgciwgaW50IHUsIGludCB2KSB7CiAgICBpZiAobCA+IHYgfHwgciA8IHUpIHJldHVybiAwOwoKICAgIGlmIChsID49IHUgJiYgciA8PSB2KSB7CiAgICAgICAgcmV0dXJuIHN0W2lkXTsKICAgIH0KCiAgICBkb3duKGlkLCBsLCByKTsKCiAgICBpbnQgZyA9IChsICsgcikgPj4gMTsKCiAgICByZXR1cm4gKAogICAgICAgIGdldChpZCA8PCAxLCBsLCBnLCB1LCB2KQogICAgICAgICsgZ2V0KGlkIDw8IDEgfCAxLCBnICsgMSwgciwgdSwgdikKICAgICkgJSBtbzsKfQoKaW50MzJfdCBtYWluKCkgewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsKICAgIGNpbi50aWUoMCk7CgogICAgY2luID4+IG47CgogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CiAgICAgICAgY2luID4+IGFbaV07CiAgICB9CgogICAgZm9yIChpbnQgaSA9IG47IGkgPiAwOyBpLS0pIHsKICAgICAgICBueHRbaV0gPSBmW2FbaV1dOwogICAgICAgIGZbYVtpXV0gPSBpOwogICAgfQoKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewogICAgICAgIGZbYVtpXV0gPSAwOwogICAgfQoKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewogICAgICAgIGlmICghZlthW2ldXSkgewogICAgICAgICAgICB1cCgxLCAxLCBuLCBpLCBuLCAxKTsKICAgICAgICB9CgogICAgICAgIGZbYVtpXV0gPSAxOwogICAgfQoKICAgIGxvbmcgbG9uZyBhbnMgPSAwOwoKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewogICAgICAgIGFucyArPSBzdF8zWzFdOwoKICAgICAgICBhbnMgJT0gbW87CgogICAgICAgIHVwKDEsIDEsIG4sIGksIG4sIC0xKTsKCiAgICAgICAgaWYgKG54dFtpXSAhPSAwKSB7CiAgICAgICAgICAgIHVwKDEsIDEsIG4sIG54dFtpXSwgbiwgMSk7CiAgICAgICAgfQogICAgfQoKICAgIGNvdXQgPDwgYW5zOwoKICAgIHJldHVybiAwOwp9