#include <bits/stdc++.h>
using namespace std;
struct Node {
  int l, r;
  int MIN, lazy;
} nodes[4000010];
void update(int o) {
  nodes[o].MIN = min(nodes[(o << 1)].MIN, nodes[((o << 1) | 1)].MIN);
}
void pushdown(int o) {
  if (nodes[o].lazy) {
    int t = nodes[o].lazy;
    nodes[o].lazy = 0;
    nodes[(o << 1)].MIN += t, nodes[(o << 1)].lazy += t;
    nodes[((o << 1) | 1)].MIN += t, nodes[((o << 1) | 1)].lazy += t;
  }
}
void build(int l, int r, int o) {
  nodes[o].l = l, nodes[o].r = r;
  if (l == r) return;
  int mid = (l + r) >> 1;
  build(l, mid, (o << 1));
  build(mid + 1, r, ((o << 1) | 1));
}
void add(int l, int r, int o, int val) {
  if (nodes[o].l >= l && nodes[o].r <= r) {
    nodes[o].MIN += val;
    nodes[o].lazy += val;
    return;
  }
  pushdown(o);
  int mid = (nodes[o].l + nodes[o].r) >> 1;
  if (l <= mid) add(l, r, (o << 1), val);
  if (r > mid) add(l, r, ((o << 1) | 1), val);
  update(o);
}
int doit(int o) {
  if (nodes[o].MIN >= 0) return -1;
  if (nodes[o].l == nodes[o].r) return nodes[o].l;
  pushdown(o);
  int mid = (nodes[o].l + nodes[o].r) >> 1;
  int ret = doit(((o << 1) | 1));
  if (ret == -1) return doit((o << 1));
  return ret;
}
int n, m, q;
int a[300010], b[300010];
int main() {
  ios::sync_with_stdio(false);
  cin >> n >> m;
  build(1, 1e6, 1);
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
    add(1, a[i], 1, -1);
  }
  for (int i = 1; i <= m; i++) {
    cin >> b[i];
    add(1, b[i], 1, 1);
  }
  cin >> q;
  while (q--) {
    int typ, t, x;
    cin >> typ >> t >> x;
    if (typ == 1) {
      add(1, a[t], 1, 1);
      add(1, x, 1, -1);
      a[t] = x;
    } else {
      add(1, b[t], 1, -1);
      add(1, x, 1, 1);
      b[t] = x;
    }
    cout << doit(1) << endl;
  }
  return 0;
}
