#include <bits/stdc++.h>
using namespace std;
const long long MaxN = 600005;
template <class t>
inline void rd(t &s) {
  s = 0;
  register char c = getchar();
  while (!isdigit(c)) c = getchar();
  while (isdigit(c)) s = (s << 3) + (s << 1) + (c ^ 48), c = getchar();
  return;
}
long long a[MaxN], b[MaxN], vis[MaxN * 3];
struct Quetion {
  long long idx, pos, val;
} que[MaxN];
struct SegTree {
  struct Node {
    long long val, lazy;
  };
  Node tr[MaxN << 2];
  inline void clear() {
    memset(tr, 0, sizeof tr);
    return;
  }
  inline void pushup(long long u) {
    tr[u].val = max(tr[(u << 1)].val, tr[(u << 1 | 1)].val);
    return;
  }
  inline void pushdown(long long u, long long l, long long r) {
    if (tr[u].lazy) {
      tr[(u << 1)].lazy += tr[u].lazy;
      tr[(u << 1 | 1)].lazy += tr[u].lazy;
      tr[(u << 1)].val += tr[u].lazy;
      tr[(u << 1 | 1)].val += tr[u].lazy;
      tr[u].lazy = 0;
    }
    return;
  }
  inline void buildtr(long long u, long long l, long long r) {
    if (l == r) {
      tr[u].val = 0;
      return;
    }
    register long long mid = (l + r) >> 1;
    buildtr((u << 1), l, mid);
    buildtr((u << 1 | 1), mid + 1, r);
    pushup((u >> 1));
    return;
  }
  inline void change(long long u, long long l, long long r, long long ql,
                     long long qr, long long x) {
    if (ql == l && r == qr) {
      tr[u].val += x;
      tr[u].lazy += x;
      return;
    }
    if (l == r) return;
    register long long mid = (l + r) >> 1;
    pushdown(u, l, r);
    if (qr <= mid)
      change((u << 1), l, mid, ql, qr, x);
    else if (mid < ql)
      change((u << 1 | 1), mid + 1, r, ql, qr, x);
    else {
      change((u << 1), l, mid, ql, mid, x);
      change((u << 1 | 1), mid + 1, r, mid + 1, qr, x);
    }
    pushup(u);
    return;
  }
  inline long long query(long long u, long long l, long long r, long long ql,
                         long long qr) {
    if (l == r) return l;
    register long long mid = (l + r) >> 1;
    pushdown(u, l, r);
    if (tr[(u << 1 | 1)].val > 0)
      return query((u << 1 | 1), mid + 1, r, ql, qr);
    else
      return query((u << 1), l, mid, ql, qr);
  }
} segtree;
signed main(void) {
  long long n, m, q;
  register long long cnt = 0;
  rd(n);
  rd(m);
  for (long long i = 1; i <= n; ++i) rd(a[i]), vis[++cnt] = a[i];
  for (long long i = 1; i <= m; ++i) rd(b[i]), vis[++cnt] = b[i];
  rd(q);
  for (long long i = 1; i <= q; ++i) {
    rd(que[i].idx);
    rd(que[i].pos);
    rd(que[i].val);
    vis[++cnt] = que[i].val;
  }
  sort(vis + 1, vis + cnt + 1);
  cnt = unique(vis + 1, vis + cnt + 1) - vis - 1;
  for (long long i = 1; i <= n; ++i)
    a[i] = lower_bound(vis + 1, vis + cnt + 1, a[i]) - vis;
  for (long long i = 1; i <= m; ++i)
    b[i] = lower_bound(vis + 1, vis + cnt + 1, b[i]) - vis;
  for (long long i = 1; i <= q; ++i)
    que[i].val = lower_bound(vis + 1, vis + cnt + 1, que[i].val) - vis;
  segtree.buildtr(1, 1, cnt);
  for (long long i = 1; i <= n; ++i) segtree.change(1, 1, cnt, 1, a[i], 1);
  for (long long i = 1; i <= m; ++i) segtree.change(1, 1, cnt, 1, b[i], -1);
  for (long long i = 1; i <= q; ++i) {
    if (que[i].idx == 1) {
      segtree.change(1, 1, cnt, 1, a[que[i].pos], -1);
      a[que[i].pos] = que[i].val;
      segtree.change(1, 1, cnt, 1, a[que[i].pos], 1);
    } else {
      segtree.change(1, 1, cnt, 1, b[que[i].pos], 1);
      b[que[i].pos] = que[i].val;
      segtree.change(1, 1, cnt, 1, b[que[i].pos], -1);
    }
    if (segtree.tr[1].val <= 0)
      puts("-1");
    else
      printf("%lld\n", vis[segtree.query(1, 1, cnt, 1, cnt)]);
  }
  return 0;
}
