#include <bits/stdc++.h>
using namespace std;

#define TRACE(x) x
#define WATCH(x) TRACE(cout << #x" = " << x << endl)
#define WATCHR(a, b) TRACE(for (auto it=a; it!=b;) cout << *(it++) << " "; cout << endl)
#define WATCHC(V) TRACE({cout << #V" = "; WATCHR(V.begin(), V.end());})

#define all(x) (x).begin(), (x).end()

using ll = long long;
using vi = vector<int>;
using vvi = vector<vi>;
using vll = vector<ll>;
using vvll = vector<vll>;
using vb = vector<bool>;
using vs = vector<string>;

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

template<int MOD> struct modnum {
    int v;
    modnum() : v(0) {}
    modnum(ll _v) : v(_v % MOD) { if (v < 0) v += MOD; }
    explicit operator int() const { return v; }
    friend ostream& operator << (ostream& o, const modnum& n) { return o << n.v; }
    friend istream& operator << (istream& i, modnum& n) { ll v; i >> v; n = modnum(v); return i; }

    friend bool operator == (const modnum& a, const modnum& b) { return a.v == b.v; }
    friend bool operator != (const modnum& a, const modnum& b) { return a.v != b.v; }

    modnum& operator += (const modnum& o) { v += o.v; if (v >= MOD) v -= MOD; return *this; }
    modnum& operator -= (const modnum& o) { v -= o.v; if (v < 0) v += MOD; return *this; }
    modnum& operator *= (const modnum& o) { v = int(ll(v) * ll(o.v) % MOD); return *this; }
    modnum operator - () { modnum res; if (v) res.v = MOD - v; return res; }
    friend modnum operator + (const modnum& a, const modnum& b) { return modnum(a) += b; }
    friend modnum operator - (const modnum& a, const modnum& b) { return modnum(a) -= b; }
    friend modnum operator * (const modnum& a, const modnum& b) { return modnum(a) *= b; }

    modnum pow(int e) const {
        if (e == 0) return 1;
        if (e & 1) return *this * this->pow(e-1);
        return (*this * *this).pow(e/2);
    }

    /* requires prime MOD */
    modnum& operator /= (const modnum& o) { return (*this) *= o.pow(MOD - 2); }
    friend modnum operator / (const modnum& a, const modnum& b) { return modnum(a) /= modnum(b); }
};
const int MOD = 1e9 + 7;
using mn = modnum<MOD>;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    int N, Q;
    cin >> N >> Q;

    vi val(N);
    for (int i = 0; i < N; i++) {
        cin >> val[i];
    }

    const mn HALF = mn(1) / 2;

    vector<vector<mn>> gt(N, vector<mn>(N));
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            gt[i][j] = val[i] > val[j];
        }
    }

    for (int q = 0; q < Q; q++) {
        int x, y;
        cin >> x >> y;
        x--, y--;

        for (int i = 0; i < N; i++) {
            if (i == x || i == y) continue;
            {
                mn avg = (gt[i][x] + gt[i][y]) * HALF;
                gt[i][x] = gt[i][y] = avg;
            }
            {
                mn avg = (gt[x][i] + gt[y][i]) * HALF;
                gt[x][i] = gt[y][i] = avg;
            }
        }
        mn avg = (gt[x][y] + gt[y][x]) * HALF;
        gt[x][y] = gt[y][x] = avg;
    }

    mn ans = 0;
    for (int i = 0; i < N; i++) {
        for (int j = i + 1; j < N; j++) {
            ans += gt[i][j];
        }
    }
    cout << (ans * mn(2).pow(Q)) << endl;

    return 0;
}



Measured memory_bytes: 37504