#include "bits/stdc++.h" using namespace std; #define int long long vector<int> tr, lz, a; #define ls (now<<1) #define rs (now<<1|1) #define mid (l+r>>1) const int MOD = 1e9 + 7; long long qpow(long long a, long long b, long long m) { a %= m; long long res = 1; while (b > 0) { if (b & 1) res = res * a % m; a = a * a % m; b >>= 1; } return res; } void pushup(int now) { tr[now] = tr[ls] + tr[rs]; } void pushdown(int now, int l, int r) { tr[ls] += lz[now] * (mid - l + 1), tr[rs] += lz[now] * (r - mid); lz[ls] += lz[now], lz[rs] += lz[now]; lz[now] = 0; } void build(int now, int l, int r) {//建树 if (l == r) { tr[now] = a[l]; return; } build(ls, l, mid), build(rs, mid + 1, r); pushup(now); } void modify(int now, int l, int r, int ml, int mr, int k) {//修改 if (l == ml && r == mr) { tr[now] += (r - l + 1) * k, lz[now] += k; return; } pushdown(now, l, r); if (mr <= mid) modify(ls, l, mid, ml, mr, k); else if (ml > mid) modify(rs, mid + 1, r, ml, mr, k); else modify(ls, l, mid, ml, mid, k), modify(rs, mid + 1, r, mid + 1, mr, k); pushup(now); } int query(int now, int l, int r, int ml, int mr) {//查询 if (l == ml && r == mr) return tr[now]; pushdown(now, l, r); if (mr <= mid) return query(ls, l, mid, ml, mr); else if (ml > mid) return query(rs, mid + 1, r, ml, mr); else return query(ls, l, mid, ml, mid) + query(rs, mid + 1, r, mid + 1, mr); } void slu() { int n; cin >> n; int cnt = 0; int N = 1e5 + 7; a.resize(N << 2, 0); lz.resize(N << 2, 0); tr.resize(N << 2, 0); vector<int> b(n + 1, 0); unordered_map<int, int> m; for (int i = 1; i <= n; i++)cin >> b[i]; for (int i = n; i >= 1; i--) { int t = b[i]; m[t]++; modify(1, 1, 1e5, t, t, 1); cnt += query(1, 1, 1e5, 1, t) - m[t]; } cnt = (qpow(2, n - 2, MOD) * (cnt % MOD)) % MOD; cout << cnt; } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int T; // cin >> T; T = 1; while (T--)slu(); }