#include <bits/stdc++.h>

using namespace std;

const int N=200010,M=524444,mo=1e9+7;

typedef long long LL;

int n,a[N],cnt[N],s0[N],s1[N],p0[N],p1[N],ans,Inv,t[M],tag[M];

vector <int> A[N];

int quick(int x,int y)
{
	int s=1;
	for (int i=1;i<=y;i<<=1,x=(LL)x*x%mo) if (i&y) s=(LL)s*x%mo;
	return s;
}

void pushdown(int x)
{
	if (tag[x]==1) return;
	tag[x<<1]=(LL)tag[x<<1]*tag[x]%mo; t[x<<1]=(LL)t[x<<1]*tag[x]%mo;
	tag[x<<1|1]=(LL)tag[x<<1|1]*tag[x]%mo; t[x<<1|1]=(LL)t[x<<1|1]*tag[x]%mo;
	tag[x]=1;
}

void Ins(int l,int r,int g,int v,int x)
{
	if (l==r)
	{
		t[x]=v; return;
	}
	pushdown(x);
	int mid=l+r>>1;
	if (g<=mid) Ins(l,mid,g,v,x<<1);else Ins(mid+1,r,g,v,x<<1|1);
	t[x]=(t[x<<1]+t[x<<1|1])%mo;
}

int calc(int l,int r,int g,int x)
{
	if (r==g) return t[x];
	pushdown(x);
	int mid=l+r>>1;
	if (g<=mid) return calc(l,mid,g,x<<1);
	return (calc(mid+1,r,g,x<<1|1)+t[x<<1])%mo;
}

int main()
{
	scanf("%d",&n); Inv=quick(2,mo-2);
	for (int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]); cnt[a[i]]++;
		A[a[i]].push_back(i);
	}
	for (int i=n;i;i--) cnt[i]+=cnt[i+1];
	for (int i=n;i;i--) cnt[i]-=n-i;
	s0[n+1]=s1[n+1]=p0[0]=p1[0]=1;
	for (int i=1;i<=n;i++)
	{
		p0[i]=(LL)p0[i-1]*cnt[i]%mo;
		p1[i]=(LL)p1[i-1]*(cnt[i]-1)%mo;
	}
	for (int i=n;i;i--)
	{
		s0[i]=(LL)s0[i+1]*cnt[i]%mo;
		s1[i]=(LL)s1[i+1]*(cnt[i]-1)%mo;
	}
	
	for (int i=1;i<M;i++) tag[i]=1;
	for (int j=1;j<=n;j++)
	{
		sort(A[j].begin(),A[j].end());
		tag[1]=(LL)tag[1]*(cnt[j]-1)%mo;
		t[1]=(LL)t[1]*(cnt[j]-1)%mo;
		for (int i=0;i<A[j].size();i++)
		{
			int s=calc(1,n,A[j][i],1);
			ans=(ans+(LL)s*s0[j+1]%mo*Inv)%mo;
			Ins(1,n,A[j][i],p0[j],1);
		}
	}
	//<=
	
	for (int i=1;i<M;i++) tag[i]=1,t[i]=0;
	for (int j=n;j;j--)
	{
		for (int i=A[j].size()-1;i>=0;i--)
		{
			int s=calc(1,n,A[j][i],1);
			ans=(ans-(LL)s*p0[j]%mo*Inv)%mo;
			Ins(1,n,A[j][i],s0[j+1],1);
		}
		tag[1]=(LL)tag[1]*(cnt[j]-1)%mo;
		t[1]=(LL)t[1]*(cnt[j]-1)%mo;
	}
	for (int i=1;i<M;i++) tag[i]=1,t[i]=0;
	for (int j=n;j;j--)
	{
		for (int i=A[j].size()-1;i>=0;i--)
		{
			int s=calc(1,n,A[j][i],1);
			ans=(ans+s)%mo;
			Ins(1,n,A[j][i],p0[n],1);
		}
	}
	//>
	if (ans<0) ans+=mo;
	printf("%d\n",ans);
	
	return 0;
}