#include <bits/stdc++.h>
using namespace std;
vector<bool> H[1004][1004];
vector<double> dp[1004][1004];
int i, j, k, n, m, x, y, z, a[(int)(1e5 + 10)];
pair<int, int> B[(int)(1e5 + 10)];
vector<pair<int, int> > C[(int)(1e5 + 10)];
double f(int x, int y, int t) {
  int p1 =
      lower_bound(C[x].begin(), C[x].end(), make_pair(t, 0)) - C[x].begin();
  int p2 =
      lower_bound(C[y].begin(), C[y].end(), make_pair(t, 0)) - C[y].begin();
  double &r = dp[x][y][p1 + p2];
  if (H[x][y][p1 + p2]) return r;
  H[x][y][p1 + p2] = 1;
  int l2 = C[y].size();
  int l1 = C[x].size();
  if (p1 == l1 and p2 == l2) return r = (x > y);
  if ((p2 == l2 and p1 != l1) or
      (p1 != l1 and C[x][p1].first < C[y][p2].first)) {
    r = f(C[x][p1].second, y, C[x][p1].first + 1) / 2;
  } else if ((p1 == l1 and p2 != l2) or
             (p2 != l2 and C[y][p2].first < C[x][p1].first))
    r = f(x, C[y][p2].second, C[y][p2].first + 1) / 2;
  else if (p1 != l1 and p2 != l2 and C[x][p1].first == C[y][p2].first) {
    r = f(y, x, C[x][p1].first + 1) / 2;
  }
  int k = m;
  if (p1 != l1) k = C[x][p1].first;
  if (p2 != l2) k = min(k, C[y][p2].first);
  return r += f(x, y, k + 1) / 2;
}
int main() {
  cin >> n >> m;
  for (i = 1; i <= n; i++) scanf("%d", a + i);
  for (i = 1; i <= m; i++) {
    scanf("%d %d", &B[i].first, &B[i].second);
    C[B[i].first].push_back(make_pair(i, B[i].second));
    C[B[i].second].push_back(make_pair(i, B[i].first));
  }
  double ans = 0;
  for (i = 1; i <= n; i++)
    for (j = 1; j <= n; j++) {
      H[i][j].resize(C[i].size() + C[j].size() + 2);
      dp[i][j].resize(C[i].size() + C[j].size() + 2);
    }
  for (i = 1; i <= n; i++)
    for (j = i + 1; j <= n; j++) {
      if (a[i] < a[j])
        ans += f(i, j, 1);
      else
        ans += 1 - f(i, j, 1);
    }
  cout << setprecision(10) << fixed << ans << '\n';
}
