#include using namespace std; const long long MOD = 1000000007; template struct binary_indexed_tree{ int N; vector BIT; binary_indexed_tree(int N): N(N), BIT(N + 1, 0){ } void add(int i, T x){ i++; while (i <= N){ BIT[i] += x; BIT[i] %= MOD; i += i & -i; } } T sum(int i){ T ans = 0; while (i > 0){ ans += BIT[i]; ans %= MOD; i -= i & -i; } return ans; } T sum(int L, int R){ return (sum(R) - sum(L) + MOD) % MOD; } }; int main(){ int N; cin >> N; vector A(N); for (int i = 0; i < N; i++){ cin >> A[i]; } vector B = A; sort(B.begin(), B.end()); B.erase(unique(B.begin(), B.end()), B.end()); int cnt = B.size(); for (int i = 0; i < N; i++){ A[i] = lower_bound(B.begin(), B.end(), A[i]) - B.begin(); } vector pow2(N); pow2[0] = 1; for (int i = 0; i < N - 1; i++){ pow2[i + 1] = pow2[i] * 2 % MOD; } vector L1(N), L2(N), R1(N), R2(N); binary_indexed_tree BIT1(cnt); for (int i = 0; i < N; i++){ L1[i] = BIT1.sum(0, A[i]); L2[i] = BIT1.sum(A[i] + 1, cnt); BIT1.add(A[i], pow2[i]); } binary_indexed_tree BIT2(cnt); for (int i = N - 1; i >= 0; i--){ R1[i] = BIT2.sum(0, A[i]); R2[i] = BIT2.sum(A[i] + 1, cnt); BIT2.add(A[i], pow2[N - 1 - i]); } long long ans = 0; for (int i = 0; i < N; i++){ ans += L1[i] * R1[i]; ans += L2[i] * R2[i]; ans %= MOD; } cout << ans << endl; }