#include <bits/stdc++.h>
using namespace std;
const long long INF = LLONG_MAX;
const int mxn = 2e5 + 5;
bool DEBUG = 0;
int a[mxn], n, m, ans = 0;
struct DSU {
  struct node {
    int par;
    vector<int> adj;
  };
  vector<node> dsu;
  DSU(int n) {
    vector<int> v;
    dsu.resize(n + 1);
    for (int i = 0; i <= n; i++) {
      dsu[i].par = i;
    }
  }
  int rt(int u) {
    if (u != dsu[u].par) dsu[u].par = rt(dsu[u].par);
    return dsu[u].par;
  }
  bool sameset(int u, int v) { return rt(u) == rt(v); }
  void merge(int u, int v) {
    u = rt(u);
    v = rt(v);
    if (dsu[u].adj.size() < dsu[v].adj.size()) swap(u, v);
    for (int x : dsu[v].adj) {
      if (x - 1 >= 0 && sameset(u, a[x - 1])) ans--;
      if (x + 1 < n && sameset(u, a[x + 1])) ans--;
      dsu[u].adj.emplace_back(x);
    }
    dsu[v].par = u;
    return;
  }
  void add(int u, int ind) { dsu[u].adj.emplace_back(ind); }
};
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> m;
  DSU dsu(m);
  for (int i = 0; i < n; i++) {
    cin >> a[i];
    if (i && a[i] != a[i - 1]) ans++;
    dsu.add(a[i], i);
  }
  cout << ans << '\n';
  for (int i = 0; i < m - 1; i++) {
    int u, v;
    cin >> u >> v;
    dsu.merge(u, v);
    cout << ans << '\n';
  }
}
