#include<cstdio> #include<algorithm> #include<cstring> #define MAXN 200005 #define P 16777216 #define rint register int #define LL long long usingnamespace std;
int n, sum1, sum2, sum3, sum4, y[MAXN], l[MAXN], r[MAXN], t[MAXN];
voidadd(int x, int y) { for (; x <= n; x += (x & -x)) t[x] = (t[x] + y) % P; }
intask(int x) { int ans = 0; for (; x; x -= (x & -x)) ans = (ans + t[x]) % P; return ans; }
intcomb(int x, int y) { LL up = 1, down = 1; for (rint i = 0; i < y; ++i) up *= (x - i), down *= (i + 1); return up / down % P; }
intmain() { scanf("%d", &n); for (rint i = 1; i <= n; ++i) scanf("%d", &y[i]); for (rint i = 1; i <= n; ++i) { l[i] = ask(y[i]); r[i] = y[i] - l[i] - 1; add(y[i], 1); } for (rint i = 1; i <= n; ++i) { sum1 = (sum1 + comb(n - r[i] - i, 3)) % P; } memset(t, 0, sizeof(t)); for (rint i = 1; i <= n; ++i) { sum2 = (sum2 + 1LL * (n - r[i] - i) * ask(y[i]) % P) % P; add(y[i], l[i]); } memset(t, 0, sizeof(t)); for (rint i = n; i >= 1; --i) { sum3 = (sum3 + 1LL * (n - r[i] - i) * (ask(y[i]) - comb(r[i], 2) + P) % P) % P; add(y[i], y[i] - 1); } memset(t, 0, sizeof(t)); for (rint i = 1; i <= n; ++i) { sum4 = (sum4 + 1LL * (n - r[i] - i) * (1LL * (i - 1) * l[i] - comb(l[i], 2) - ask(y[i])) % P + P) % P; add(y[i], i); } printf("%d\n", (sum2 + sum3 + sum4 - sum1 + P) % P); }