// Author -- Frame

#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<iostream>

#define lowbit(x) ((x)&(-x))
#define Finline __inline__ __attribute__ ((always_inline))
#define DEBUG fprintf(stderr,"Running on Line %d in Function %s\n",__LINE__,__FUNCTION__)

typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;

const int inf=0x3f3f3f3f,Inf=0x7fffffff;
const ll INF=0x7fffffffffffffff;
const double eps=1e-10;

uint seed=19260817;
const uint _RAND_MAX_=4294967295u;
Finline uint Rand(){return seed=seed*998244353u+1000000007u;}

template <typename _Tp>_Tp gcd(const _Tp &a,const _Tp &b){return (!b)?a:gcd(b,a%b);}
template <typename _Tp>Finline _Tp abs(const _Tp &a){return a>=0?a:-a;}
template <typename _Tp>Finline _Tp max(const _Tp &a,const _Tp &b){return a<b?b:a;}
template <typename _Tp>Finline _Tp min(const _Tp &a,const _Tp &b){return a<b?a:b;}
template <typename _Tp>Finline void chmax(_Tp &a,const _Tp &b){(a<b)&&(a=b);}
template <typename _Tp>Finline void chmin(_Tp &a,const _Tp &b){(b<a)&&(a=b);}
template <typename _Tp>Finline bool _cmp(const _Tp &a,const _Tp &b){return abs(a-b)<=eps;}
template <typename _Tp>Finline void read(_Tp &x)
{
	register char ch(getchar());
	bool f(false);
	while(ch<48||ch>57) f|=ch==45,ch=getchar();
	x=ch&15,ch=getchar();
	while(ch>=48&&ch<=57) x=(((x<<2)+x)<<1)+(ch&15),ch=getchar();
	if(f) x=-x;
}
template <typename _Tp,typename... Args>Finline void read(_Tp &t,Args &...args)
{
	read(t);read(args...);
}
Finline int read_str(char *s)
{
	register char ch(getchar());
	while(ch==' '||ch=='\r'||ch=='\n') ch=getchar();
	register char *tar=s;
	*tar=ch,ch=getchar();
	while(ch!=' '&&ch!='\r'&&ch!='\n'&&ch!=EOF) *(++tar)=ch,ch=getchar();
	return tar-s+1;
}

const int N=3005;
const int mod=1000000007;
const int inv2=500000004;
template<typename _Tp1,typename _Tp2>Finline void add(_Tp1 &a,_Tp2 b){(a+=b)>=mod&&(a-=mod);}
int dp[N][N];
int pos[N];
int t1[N],t2[N],t3[N],t4[N];
bool used1[N],used2[N],used3[N],used4[N];
int a[N];
int main()
{
	int n,q;
	read(n,q);
	int x,y;
	for(int i=1;i<=n;++i)
	{
		read(a[i]);
	}
	for(int i=1;i<=n;++i)
	{
		for(int j=1;j<=n;++j)
		{
			if(a[i]<a[j])
			{
				dp[i][j]=1;
			}
		}
	}
	int mul=1;
	for(int i=1;i<=q;++i)
	{
		add(mul,mul);
		read(x,y);
		memset(used1,0,n+3);
		memset(used2,0,n+3);
		memset(used3,0,n+3);
		memset(used4,0,n+3);
		for(int j=1;j<=n;++j) t1[j]=dp[x][j],t3[j]=dp[y][j];
		for(int j=1;j<=n;++j) t2[j]=dp[j][y],t4[j]=dp[j][x];
		if(!used1[y]&&!used4[x])
		{
			used1[y]=used4[x]=true;
			add(dp[x][y],t3[x]);
		}
		if(!used2[x]&&!used3[y])
		{
			used2[x]=used3[y]=true;
			add(dp[y][x],t1[y]);
		}
		for(int j=1;j<=n;++j)
		{
			if(!used1[j])
			{
				used1[j]=true;
				add(dp[x][j],t3[j]);
			}
			if(!used2[j])
			{
				used2[j]=true;
				add(dp[y][j],t1[j]);
			}
			if(!used3[j])
			{
				used3[j]=true;
				add(dp[j][x],t2[j]);
			}
			if(!used4[j])
			{
				used4[j]=true;
				add(dp[j][y],t4[j]);
			}
		}
		for(int j=1;j<=n;++j)
		{
			dp[x][j]=1ll*dp[x][j]*inv2%mod;
			dp[y][j]=1ll*dp[y][j]*inv2%mod;
			dp[j][x]=1ll*dp[j][x]*inv2%mod;
			dp[j][y]=1ll*dp[j][y]*inv2%mod;
		}
		add(dp[x][y],dp[x][y]);
		add(dp[y][x],dp[y][x]);
		add(dp[x][x],dp[x][x]);
		add(dp[y][y],dp[y][y]);
		for(int j=1;j<=n;++j) dp[j][j]=0;
	}
	int ans=0;
	for(int i=1;i<=n;++i)
	{
		for(int j=i+1;j<=n;++j)
		{
			add(ans,1ll*dp[j][i]*mul%mod);
		}
	}
	printf("%d\n",ans);
	return 0;
}


Measured memory_bytes: 35584