#include <bits/stdc++.h>
using namespace std;
const long long MX = 3e5 + 1, MOD = 1e9 + 7;
long long a[MX];
struct node {
  long long pp, pn, np, nn;
};
node seg[4 * MX];
node merge(node a, node b) {
  node tmp;
  tmp.pp = max(a.pp, max(b.pp, max(a.pp + b.np, a.pn + b.pp)));
  tmp.pn = max(a.pn, max(b.pn, max(a.pp + b.nn, a.pn + b.pn)));
  tmp.np = max(a.np, max(b.np, max(a.np + b.np, a.nn + b.pp)));
  tmp.nn = max(a.nn, max(b.nn, max(a.np + b.nn, a.nn + b.pn)));
  return tmp;
}
void build(long long pos, long long l, long long r) {
  if (l == r) {
    seg[pos].pp = a[l];
    seg[pos].nn = -a[l];
    seg[pos].pn = seg[pos].np = 0;
    return;
  }
  long long m = l + (r - l) / 2, left = 2 * pos, right = 2 * pos + 1;
  build(left, l, m);
  build(right, m + 1, r);
  seg[pos] = merge(seg[left], seg[right]);
}
void update(long long i, long long u, long long pos, long long l, long long r) {
  if (l == r) {
    seg[pos].pp = a[l];
    seg[pos].nn = -a[l];
    seg[pos].pn = seg[pos].np = 0;
    return;
  }
  long long m = l + (r - l) / 2, left = 2 * pos, right = 2 * pos + 1;
  if (i <= m)
    update(i, u, left, l, m);
  else
    update(i, u, right, m + 1, r);
  seg[pos] = merge(seg[left], seg[right]);
}
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  long long t = 1;
  cin >> t;
  while (t--) {
    long long n, q;
    cin >> n >> q;
    for (long long i = 1; i <= n; i++) cin >> a[i];
    build(1, 1, n);
    cout << max(seg[1].pp, seg[1].pn) << "\n";
    while (q--) {
      long long l, r;
      cin >> l >> r;
      if (l != r) {
        swap(a[l], a[r]);
        update(l, a[l], 1, 1, n);
        update(r, a[r], 1, 1, n);
      }
      cout << max(seg[1].pp, seg[1].pn) << "\n";
    }
  }
}
