#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define rep(i,n) for(int i=0;i<(n);i++) #define all(x) x.begin(), x.end() #define rall(x) x.rbegin(), x.rend() #define sz(x) ((int)(x).size()) #define pb push_back using ll = long long; using namespace std; templatebool chmax(T &a, const T &b) { if (abool chmin(T &a, const T &b) { if (b p2,p2i; ll mpow(ll a, ll x){ ll res = 1; while(x > 0){ if(x & 1) res = (res * a) % mod; a = (a * a) % mod; x >>= 1; } return res; } ll inv(ll x){ ll res = 1, k = mod - 2; while(k){ if(k&1) res = (res * x) % mod; x = (x * x) % mod; k >>= 1; } return res; } ll op1(ll a,ll b){return (a+b)%mod;} ll e1(){return 0LL;} ll op(ll a,ll b){ return (a+b)%mod; } ll e(){return 0LL;} ll mapping(ll f, ll x){ return x * p2i[f] % mod; } ll composition(ll f, ll g){ return f+g; } ll id(){return 0LL;} int main(){ p2.resize(300000); rep(i,300000) p2[i] = mpow(2,i); p2i.resize(300000); rep(i,300000) p2i[i] = inv(p2[i]); ll N; cin >> N; vector A(N); rep(i,N) cin >> A[i]; rep(i,N) A[i]--; atcoder::segtree seg1(N); atcoder::lazy_segtree seg(N); ll ans = 0; rep(i,N){ seg.apply(0,N,1); ans += (seg1.prod(A[i]+1,N)-seg.prod(A[i]+1,N)+mod)%mod * p2[N-1] % mod; seg.set(A[i],1); seg1.set(A[i],1); } cout << ans%mod << '\n'; return 0; }