#include <bits/stdc++.h>
#pragma GCC target("avx2")
#pragma GCC optimization("O3")
#pragma GCC optimization("unroll-loops")
const long long INF = 0x3f3f3f3f3f3f3f3f;
const long long llinf = (1LL << 62);
const int inf = (1 << 30);
const long long nmax = 3e5 + 50;
const int mod = 1e9 + 7;
const int lim = 1e6;
using namespace std;
int n, m, a[nmax], b[nmax], st[4 * lim + 50], i, t, x, lzy[4 * lim + 50], q;
void push(int nod, int l, int r) {
  if (l > r) return;
  if (!lzy[nod]) return;
  st[nod] += lzy[nod];
  if (l != r) {
    lzy[nod * 2] += lzy[nod];
    lzy[nod * 2 + 1] += lzy[nod];
  }
  lzy[nod] = 0;
}
void upd(int nod, int l, int r, int tl, int tr, int v) {
  push(nod, l, r);
  if (tl <= l && r <= tr) {
    lzy[nod] += v;
    push(nod, l, r);
    return;
  }
  int mid = (l + r) / 2;
  if (tl <= mid) upd(nod * 2, l, mid, tl, tr, v);
  if (mid < tr) upd(nod * 2 + 1, mid + 1, r, tl, tr, v);
  push(nod * 2, l, mid);
  push(nod * 2 + 1, mid + 1, r);
  st[nod] = max(st[nod * 2], st[nod * 2 + 1]);
}
int qry(int nod, int l, int r) {
  push(nod, l, r);
  if (l == r) return l;
  int mid = (l + r) / 2;
  push(2 * nod, l, mid);
  push(2 * nod + 1, mid + 1, r);
  if (st[2 * nod + 1] > 0) return qry(2 * nod + 1, mid + 1, r);
  return qry(2 * nod, l, mid);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cerr.tie(0);
  cout.tie(0);
  cin >> n >> m;
  for (i = 1; i <= n; i++) {
    cin >> a[i];
    upd(1, 1, lim, 1, a[i], 1);
  }
  for (i = 1; i <= m; i++) {
    cin >> b[i];
    upd(1, 1, lim, 1, b[i], -1);
  }
  cin >> q;
  while (q--) {
    cin >> t >> i >> x;
    if (t == 1) {
      upd(1, 1, lim, 1, a[i], -1);
      a[i] = x;
      upd(1, 1, lim, 1, a[i], 1);
    } else {
      upd(1, 1, lim, 1, b[i], 1);
      b[i] = x;
      upd(1, 1, lim, 1, b[i], -1);
    }
    if (st[1] <= 0)
      cout << -1 << '\n';
    else
      cout << qry(1, 1, lim) << '\n';
  }
  return 0;
}
