#include <bits/stdc++.h>
using namespace std;
const double PI = acos(-1);
const int mod = 1e9 + 7;
const int MXI = 1e9 + 5;
const long long MXL = 1e18 + 5;
struct hash_pair {
  template <class T1, class T2>
  size_t operator()(const pair<T1, T2> &p) const {
    auto hash1 = hash<T1>{}(p.first);
    auto hash2 = hash<T2>{}(p.second);
    return hash1 ^ hash2;
  }
};
long long gcd(long long a, long long b) {
  while (b) {
    a %= b;
    swap(a, b);
  }
  return a;
}
long long lcm(long long a, long long b) { return (a / gcd(a, b) * b); }
long long bigmod(long long a, long long p, long long M) {
  p %= (M - 1);
  long long result = 1LL;
  while (p > 0LL) {
    if (p & 1LL) result = result * a % M;
    a = a * a % M;
    p >>= 1LL;
  }
  return result;
}
long long inverse(long long a, long long M) {
  if (gcd(a, M) == 1) return bigmod(a, M - 2, M) % M;
  return 1;
}
long long ncr(long long a, long long b) {
  long long x = max(a - b, b), ans = 1;
  for (long long K = a, L = 1; K >= x + 1; K--, L++) {
    ans = ans * K % mod;
    ans = ans * inverse(L, mod) % mod;
  }
  return ans;
}
long long egcd(long long a, long long b, long long &x, long long &y) {
  if (a == 0) {
    x = 0;
    y = 1;
    return b;
  }
  long long x1, y1;
  long long d = egcd(b % a, a, x1, y1);
  x = y1 - (b / a) * x1;
  y = x1;
  return d;
}
void pbin(int n) {
  vector<int> vv;
  while (n) {
    vv.push_back(n % 2);
    n >>= 1;
  }
  for (int K = (int)vv.size(); K <= 5; K++) vv.push_back(0);
  reverse(begin(vv), end(vv));
  for (auto x : vv) cout << x;
  cout << "\n";
}
const int N = 1e6 + 5;
const int MX = 1e6;
int num1[MX + 5], num2[MX + 5];
struct Node {
  int val;
  int add;
  Node() {}
  Node(int _val, int _add) {
    val = _val;
    add = _add;
  }
} ara[4 * MX + 5];
void propogate(int at) {
  ara[at * 2].val += ara[at].add;
  ara[at * 2 + 1].val += ara[at].add;
  ara[at * 2].add += ara[at].add;
  ara[at * 2 + 1].add += ara[at].add;
  ara[at].add = 0;
}
void update(int at, int l, int r, int L, int R, int v) {
  if (L <= l && r <= R) {
    ara[at].add += v;
    ara[at].val += v;
    return;
  }
  propogate(at);
  int mid = (l + r) / 2;
  if (L <= mid) update(at * 2, l, mid, L, R, v);
  if (mid + 1 <= R) update(at * 2 + 1, mid + 1, r, L, R, v);
  ara[at].val = max(ara[at * 2].val, ara[at * 2 + 1].val);
}
int query(int at, int l, int r) {
  if (l == r) return l;
  propogate(at);
  int mid = (l + r) / 2;
  if (ara[at * 2 + 1].val > 0) return query(at * 2 + 1, mid + 1, r);
  if (ara[at * 2].val > 0) return query(at * 2, l, mid);
  return -1;
}
void task() {
  int n, m, q, t, i, x;
  memset(ara, 0, sizeof ara);
  cin >> n >> m;
  for (int K = 1; K <= n; K++) {
    cin >> num1[K];
    update(1, 1, N, 1, num1[K], 1);
  }
  for (int K = 1; K <= m; K++) {
    cin >> num2[K];
    update(1, 1, N, 1, num2[K], -1);
  }
  cin >> q;
  while (q--) {
    cin >> t;
    if (t == 1) {
      cin >> i >> x;
      update(1, 1, N, 1, num1[i], -1);
      num1[i] = x;
      update(1, 1, N, 1, num1[i], 1);
    } else {
      cin >> i >> x;
      update(1, 1, N, 1, num2[i], 1);
      num2[i] = x;
      update(1, 1, N, 1, num2[i], -1);
    }
    int ans = query(1, 1, N);
    cout << ans << "\n";
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  task();
  return 0;
}
