#include <bits/stdc++.h>
using namespace std;
const int MX = 1000001;
int tree[4000100];
int lazy[4000100];
void propagate(int no, int nl, int nr) {
  if (nl + 1 != nr) {
    lazy[2 * no] += lazy[no];
    lazy[2 * no + 1] += lazy[no];
    tree[2 * no] += lazy[no];
    tree[2 * no + 1] += lazy[no];
  }
  lazy[no] = 0;
}
void update(int l, int r, int val, int no, int nl, int nr) {
  propagate(no, nl, nr);
  if (r <= nl || nr <= l) return;
  if (l <= nl && nr <= r) {
    lazy[no] += val;
    tree[no] += val;
    return;
  }
  int mid = (nl + nr) / 2;
  update(l, r, val, 2 * no, nl, mid);
  update(l, r, val, 2 * no + 1, mid, nr);
  tree[no] = max(tree[2 * no], tree[2 * no + 1]);
}
void update(int l, int r, int val, int n) { update(l, r, val, 1, 0, n); }
int query(int no, int nl, int nr) {
  propagate(no, nl, nr);
  if (nl + 1 == nr) return nl;
  int mid = (nl + nr) / 2;
  if (tree[2 * no + 1] > 0)
    return query(2 * no + 1, mid, nr);
  else
    return query(2 * no, nl, mid);
}
int query(int n) { return query(1, 0, n); }
int a[300000];
int b[300000];
int main() {
  int n, m, q;
  scanf("%d %d", &n, &m);
  for (int i = 0; i < n; i++) scanf("%d", &a[i]);
  for (int i = 0; i < m; i++) scanf("%d", &b[i]);
  for (int i = 0; i < n; i++) update(1, a[i] + 1, 1, MX);
  for (int i = 0; i < m; i++) update(1, b[i] + 1, -1, MX);
  scanf("%d", &q);
  while (q--) {
    int t, x, v;
    scanf("%d %d %d", &t, &x, &v);
    x--;
    if (t == 1) {
      update(1, a[x] + 1, -1, MX);
      a[x] = v;
      update(1, a[x] + 1, 1, MX);
    } else {
      update(1, b[x] + 1, 1, MX);
      b[x] = v;
      update(1, b[x] + 1, -1, MX);
    }
    if (tree[1] <= 0)
      printf("-1\n");
    else
      printf("%d\n", query(MX));
  }
  return 0;
}
