#include <bits/stdc++.h>
#pragma GCC optimize(3)
using namespace std;
const int Mod = 1e9 + 7;
const int N = 5e5 + 100;
const int INF = 0x3f3f3f3f;
const long long LINF = 0x3f3f3f3f3f3f3f3f;
inline long long dpow(long long a, long long b) {
  long long r = 1, t = a;
  while (b) {
    if (b & 1) r = (r * t) % Mod;
    b >>= 1;
    t = (t * t) % Mod;
  }
  return r;
}
inline long long fpow(long long a, long long b) {
  long long r = 1, t = a;
  while (b) {
    if (b & 1) r = (r * t);
    b >>= 1;
    t = (t * t);
  }
  return r;
}
struct node {
  int id, w;
  bool operator<(const node &oth) const { return w > oth.w; }
};
struct Ask {
  int op, x;
} qi[N];
pair<int, int> eg[N];
set<node> s[N];
int fa[N], sz[N], n, m, q;
int a[N];
bool vis[N];
stack<pair<int, int> > st;
void Init() {
  for (int i = 1; i <= n; i++) fa[i] = i, sz[i] = 1;
}
int Find(int x) {
  while (x != fa[x]) x = fa[x];
  return x;
}
void Merge(int x, int y) {
  x = Find(x);
  y = Find(y);
  if (x == y) {
    st.push({0, 0});
    return;
  }
  if (sz[x] > sz[y]) swap(x, y);
  fa[x] = y;
  st.push({x, y});
  sz[y] += sz[x];
  for (auto it : s[x]) s[y].insert(it);
}
void Cancle() {
  int x = st.top().first, y = st.top().second;
  st.pop();
  if (!x && !y) return;
  fa[x] = x;
  sz[y] -= sz[x];
  for (auto it : s[x]) {
    if (s[y].find(it) != s[y].end()) s[y].erase(it);
  }
}
int main() {
  cin >> n >> m >> q;
  Init();
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]), s[i].insert({i, a[i]});
  for (int i = 1; i <= m; i++) scanf("%d %d", &eg[i].first, &eg[i].second);
  for (int i = 1; i <= q; i++) {
    scanf("%d %d", &qi[i].op, &qi[i].x);
    if (qi[i].op == 2) vis[qi[i].x] = true;
  }
  for (int i = 1; i <= m; i++)
    if (!vis[i]) Merge(eg[i].first, eg[i].second);
  for (int i = q; i >= 1; i--) {
    if (qi[i].op == 1) continue;
    int u = eg[qi[i].x].first;
    int v = eg[qi[i].x].second;
    Merge(u, v);
  }
  for (int i = 1; i <= q; i++) {
    int op = qi[i].op, x = qi[i].x;
    if (op == 1) {
      int u = Find(x);
      while (!s[u].empty() && !a[s[u].begin()->id]) s[u].erase(s[u].begin());
      if (s[u].empty())
        puts("0");
      else {
        printf("%d\n", s[u].begin()->w);
        a[s[u].begin()->id] = 0;
      }
    } else
      Cancle();
  }
  return 0;
}
