#include <bits/stdc++.h>
using namespace std;
int n, m, q;
int par[100005], ans[100005];
pair <int, int> edge[100005];
vector <int> idx[100005];

struct ZATA {
    int l, r, val;
};

vector <ZATA> vt[100005];

int FIND(int u) {
    if (par[u] == u) return u;
    else return par[u] = FIND(par[u]);
}

void MERGE(int u, int v) {
    u = FIND(u);
    v = FIND(v);
    if (u == v) return;
    par[v] = u;
}

main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    freopen("TEST.inp", "r", stdin);
    freopen("TEST.out", "w", stdout);
    cin >> n >> m >> q;
    for (int i = 1; i <= n; i++) {
        int a;
        cin >> a;
        idx[a].push_back(i);
    }
    for (int i = 1; i <= q; i++) cin >> edge[i].first >> edge[i].second;

    int mid = (-1 + q + 1) / 2;
    for (int i = 1; i <= m; i++)
        vt[mid].push_back({-1, q + 1, i});
    int dem = 0;

    while (dem < m) {
        for (int i = 1; i <= n; i++) par[i] = i;
        for (int i = 0; i <= q; i++) {
            if (i) MERGE(edge[i].first, edge[i].second);
            for (auto res : vt[i]) {
                bool ok = true;
                int root = 0;
                for (auto p : idx[res.val]) {
                    if (root == 0) root = FIND(p);
                    else if (root != FIND(p)) ok = false;
                }
                if (ok) res.r = i;
                else res.l = i;
                mid = (res.l + res.r) / 2;
                if (res.l == res.r - 1) {
                    ans[res.val] = res.r;
                    dem++;
                } else vt[mid].push_back(res);
            }
            vt[i].clear();
        }
    }

    for (int i = 1; i <= m; i++)
        if (ans[i] == q + 1) cout << -1 << '\n';
        else cout << ans[i] << '\n';

    return 0;
}
