#include <bits/stdc++.h>
using namespace std;
const int MOD = 30000 + 7;
const int N = 30000 + 10;
const int K = 101;
const int MAXA = 1e6 + 10;
const int inf = 1e9;
vector<int> tre;
vector<int> updater;
int n;
void fix(int tl, int tr, int v) {
  if (updater[v] == 0) return;
  tre[v] += updater[v];
  if (tl == tr) {
    updater[v] = 0;
    return;
  }
  updater[v * 2] += updater[v];
  updater[v * 2 + 1] += updater[v];
  updater[v] = 0;
}
void update(int l, int r, int delta, int tl, int tr, int v) {
  fix(tl, tr, v);
  if (tr < l || r < tl) {
    return;
  }
  if (l <= tl && tr <= r) {
    updater[v] += delta;
    fix(tl, tr, v);
    return;
  }
  int tm = (tl + tr) / 2;
  update(l, r, delta, tl, tm, v * 2);
  update(l, r, delta, tm + 1, tr, v * 2 + 1);
  tre[v] = max(tre[v * 2], tre[v * 2 + 1]);
}
int get_ans(int tl, int tr, int v) {
  if (tre[v] <= 0) {
    return -1;
  }
  if (tl == tr) {
    return tl;
  }
  int tm = (tl + tr) / 2;
  fix(tl, tr, v);
  fix(tl, tm, v * 2);
  fix(tm + 1, tr, v * 2 + 1);
  if (tre[v * 2 + 1] > 0) return get_ans(tm + 1, tr, v * 2 + 1);
  return get_ans(tl, tm, v * 2);
}
int32_t main() {
  cin.sync_with_stdio(0);
  cout.sync_with_stdio(0);
  int n, m;
  cin >> n >> m;
  tre.resize(MAXA * 4);
  updater.resize(MAXA * 4);
  vector<int> a(n);
  vector<int> b(m);
  for (int i = 0; i < n; i++) {
    int x;
    cin >> x;
    a[i] = x;
    update(0, x, 1, 0, MAXA - 1, 1);
  }
  for (int i = 0; i < m; i++) {
    int x;
    cin >> x;
    b[i] = x;
    update(0, x, -1, 0, MAXA - 1, 1);
  }
  int q;
  cin >> q;
  while (q--) {
    int tp;
    int x, y;
    cin >> tp >> x >> y;
    if (tp == 1) {
      update(0, a[x - 1], -1, 0, MAXA - 1, 1);
      a[x - 1] = y;
      update(0, y, 1, 0, MAXA - 1, 1);
    }
    if (tp == 2) {
      update(0, b[x - 1], 1, 0, MAXA - 1, 1);
      b[x - 1] = y;
      update(0, y, -1, 0, MAXA - 1, 1);
    }
    int aans = get_ans(0, MAXA - 1, 1);
    cout << aans << '\n';
  }
  return 0;
}
