#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC target("sse4")
using namespace std;
int sz = 1 << 20;
long long tree[1 << 21], lazy[1 << 21];
void propagate(int ind) {
  tree[2 * ind] += lazy[ind];
  tree[2 * ind + 1] += lazy[ind];
  if (2 * ind < sz) {
    lazy[2 * ind] += lazy[ind];
    lazy[2 * ind + 1] += lazy[ind];
  }
  lazy[ind] = 0;
}
void update(int ind, int st, int e, int l, int r, long long v) {
  if (l == st && r == e) {
    tree[ind] += v;
    if (ind < sz) lazy[ind] += v;
    return;
  }
  propagate(ind);
  int mid = (st + e) / 2;
  if (l < mid) update(2 * ind, st, mid, l, min(r, mid), v);
  if (r > mid) update(2 * ind + 1, mid, e, max(l, mid), r, v);
  tree[ind] = min(tree[2 * ind], tree[2 * ind + 1]);
}
void update(int a, int b, long long v) { update(1, 0, sz, a, b, v); }
long long query(int ind, int st, int e) {
  if (tree[ind] >= 0) return -1;
  if (st + 1 == e) return e;
  propagate(ind);
  int mid = (st + e) / 2;
  long long curAns = query(2 * ind + 1, mid, e);
  if (curAns != -1) {
    return curAns;
  } else {
    return query(2 * ind, st, mid);
  }
}
long long n, m, q;
int a[300005];
int b[300005];
int main() {
  cin >> n >> m;
  for (int i = 0; i < (n); i++) {
    cin >> a[i];
    update(0, a[i], -1);
  }
  for (int i = 0; i < (m); i++) {
    cin >> b[i];
    update(0, b[i], 1);
  }
  cin >> q;
  for (int i = 0; i < (q); i++) {
    int c, ni, x;
    cin >> c >> ni >> x;
    ni--;
    if (c == 1) {
      update(0, a[ni], 1);
      a[ni] = x;
      update(0, a[ni], -1);
    } else {
      update(0, b[ni], -1);
      b[ni] = x;
      update(0, b[ni], 1);
    }
    cout << query(1, 0, sz) << "\n";
  }
  return 0;
}
