#include using namespace std; const int MX = 200000, LOG = 60; const long long INF = 1e18 + 42; namespace seg_tree { const int SIZE = 2 * MX * LOG; struct { long long l, r, mn, mx; int lSon, rSon, cnt; long long dp[2][2]; } t[SIZE]; int tw; int newNode(long long l, long long r) { int v = ++tw; assert(v < SIZE); t[v].l = l; t[v].r = r; t[v].lSon = t[v].rSon = 0; t[v].cnt = 0; return v; } void add(int v, long long x, int d) { t[v].cnt += d; if (t[v].l == t[v].r) { t[v].mn = t[v].mx = x; t[v].dp[0][0] = t[v].dp[1][1] = -1 * INF; t[v].dp[0][1] = t[v].dp[1][0] = 0; } else { long long c = (t[v].l + t[v].r) / 2; if (x <= c) { if (t[v].lSon == 0) t[v].lSon = newNode(t[v].l, c); add(t[v].lSon, x, d); } else { if (t[v].rSon == 0) t[v].rSon = newNode(c + 1, t[v].r); add(t[v].rSon, x, d); } int copyFrom = -1, lSon = t[v].lSon, rSon = t[v].rSon; if (t[lSon].cnt == 0) copyFrom = rSon; if (t[rSon].cnt == 0) copyFrom = lSon; if (copyFrom != -1) { t[v].mn = t[copyFrom].mn; t[v].mx = t[copyFrom].mx; memcpy(t[v].dp, t[copyFrom].dp, sizeof t[v].dp); } else { t[v].mn = t[lSon].mn; t[v].mx = t[rSon].mx; for (int i = 0; i < 2; i++) for (int j = 0; j < 2; j++) { t[v].dp[i][j] = -1 * INF; for (int p = 0; p < 2; p++) for (int q = 0; q < 2; q++) t[v].dp[i][j] = max(t[v].dp[i][j], t[lSon].dp[i][p] + t[rSon].dp[q][j] + p * q * (t[rSon].mn - t[lSon].mx)); } } } } } int main() { int T; ignore = scanf("%d", &T); while (T--) { seg_tree::tw = 0; int n, q; ignore = scanf("%d %d", &n, &q); seg_tree::newNode(0, INF); while (n--) { long long x; ignore = scanf("%lld", &x); seg_tree::add(1, x, +1); } while (q--) { int t; long long x; ignore = scanf("%d %lld", &t, &x); seg_tree::add(1, x, 3 - 2 * t); long long ans = seg_tree::t[1].mx - seg_tree::t[1].mn - max(seg_tree::t[1].dp[1][1], 0ll); printf("%lld\n", ans); } } return 0; }