#include <bits/stdc++.h>
using namespace std;
#define faster ios_base::sync_with_stdio(false); cin.tie(NULL)
#define Bit(mask , i) ((mask >> i) & 1)
#define fi first
#define se second
#define _LOG2(nl) 31 - __builtin_clz(nl)
#define c_bit(nl) __builtin_popcount(nl)
#define ii pair<long long , int>
#define lll pair<long long , pair<long long , long long>>
#define lii pair<long long , pair<long long , int>>
#define iii pair<int , pair<int , int>>
#define iiii pair<pair<int , int> , pair<int , int>>
#define llll pair<pair<__int128 , __int128> , pair<__int128 , __int128>>
#define li pair<long long , int>
#define db long double
#define onBit(mask , i) (mask | (1 << i))
#define offBit(mask , i) (mask & (~(1 << i)))

const long long MOD = 1e9 + 7;
const int N = 5e5 + 7;
int a[N] , n , BIT_n[N] , L[N] , R[N];
long long BIT[N];

void inp(){
    cin >> n;
    for (int i = 1 ; i <= n ; ++i){
        cin >> a[i];
    }
}

void update(int x , long long val){
    while (x <= n){
        BIT[x] += val;
        x += x & -x;
    }
}

long long get(int x){
    long long res = 0;
    while (x > 0){
        res += BIT[x];
        x -= x & -x;
    }

    return res;
}

void update_n(int x , int val){
    while (x > 0){
        BIT_n[x] += val;
        x -= x & -x;
    }
}

int get_n(int x){
    int res = 0;
    while (x <= n){
        res += BIT_n[x];
        x += x & -x;
    }

    return res;
}

void ktao(){
    for (int i = 1 ; i <= n ; ++i){
        L[i] = get(a[i]);
        update(a[i] , 1);
    }

    for (int i = n ; i >= 1 ; --i){
        R[i] = get_n(a[i]);
        update_n(a[i] , 1);
    }
}

void solve(){
    ktao();
    memset(BIT , 0 , sizeof BIT);

    long long res = 0;
    for (int i = 1 ; i <= n ; ++i){
        long long tmp = ((1LL * L[i]) * (1LL * L[i] - 1LL)) / 2;
        tmp -= get(a[i]);
        update(a[i] , L[i]);

        res += tmp * (1LL * R[i]);
        res %= MOD;
    }
    cout << res;
}

int main(){
//    freopen("difmax.inp" , "r" , stdin);
//    freopen("difmax.out" , "w" , stdout);
    faster;
    inp();
    solve();
    return 0;
}

