#include <bits/stdc++.h>
using namespace std;
template <class C>
void mini(C& a, C b) {
  a = min(a, b);
}
template <class C>
void maxi(C& a, C b) {
  a = max(a, b);
}
long long powmod(long long a, long long b) {
  long long res = 1;
  a %= 1000000007;
  assert(b >= 0);
  for (; b; b >>= 1) {
    if (b & 1) res = res * a % 1000000007;
    a = a * a % 1000000007;
  }
  return res;
}
long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
struct item {
  long long positivo_par;
  long long negativo_par;
  long long positivo_impar;
  long long negativo_impar;
};
struct segtree {
  int size;
  vector<item> tree;
  item NEUTRAL_ELEMENT = {0, 0, -1000000000010, -1000000000010};
  item single(long long v) { return {0, 0, v, -v}; }
  void init(int n) {
    size = 1;
    while (size < n) size *= 2;
    tree.assign(size * 2, NEUTRAL_ELEMENT);
  }
  item merge(item a, item b) {
    item res;
    res.positivo_par = a.positivo_par + b.positivo_par;
    maxi(res.positivo_par, a.positivo_impar + b.negativo_impar);
    res.positivo_impar = a.positivo_par + b.positivo_impar;
    maxi(res.positivo_impar, a.positivo_impar + b.negativo_par);
    res.negativo_par = a.negativo_par + b.negativo_par;
    maxi(res.negativo_par, a.negativo_impar + b.positivo_impar);
    res.negativo_impar = a.negativo_par + b.negativo_impar;
    maxi(res.negativo_impar, a.negativo_impar + b.positivo_par);
    return res;
  }
  void build(int node, int lx, int rx, vector<long long>& a) {
    if (rx - lx == 1) {
      if (lx < (int)a.size()) {
        tree[node] = single(a[lx]);
      }
      return;
    }
    int m = (lx + rx) / 2;
    build(2 * node + 1, lx, m, a);
    build(2 * node + 2, m, rx, a);
    tree[node] = merge(tree[2 * node + 1], tree[2 * node + 2]);
  }
  void build(vector<long long>& a) { build(0, 0, size, a); }
  void set(int i, long long a, int node, int l, int r) {
    if (r - l == 1) {
      tree[node] = single(a);
      return;
    }
    int m = (l + r) / 2;
    if (i < m)
      set(i, a, 2 * node + 1, l, m);
    else
      set(i, a, 2 * node + 2, m, r);
    tree[node] = merge(tree[2 * node + 1], tree[2 * node + 2]);
  }
  void set(int i, long long a) { set(i, a, 0, 0, size); }
  item get(int node, int lx, int rx, int L, int R) {
    if (L >= rx || R <= lx) return NEUTRAL_ELEMENT;
    if (lx >= L && rx <= R) return tree[node];
    int m = (lx + rx) / 2;
    item s1 = get(2 * node + 1, lx, m, L, R);
    item s2 = get(2 * node + 2, m, rx, L, R);
    return merge(s1, s2);
  }
  item get(int L, int R) { return get(0, 0, size, L, R); }
};
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int t;
  cin >> t;
  while (t--) {
    int n, q;
    cin >> n >> q;
    vector<long long> a(n);
    for (int i = 0; i < n; i++) {
      cin >> a[i];
    }
    segtree st;
    st.init(n);
    st.build(a);
    item res = st.get(0, n);
    cout << max(res.positivo_par, res.positivo_impar) << "\n";
    for (int i = 0; i < q; i++) {
      int l, r;
      cin >> l >> r;
      l--;
      r--;
      swap(a[l], a[r]);
      st.set(l, a[l]);
      st.set(r, a[r]);
      res = st.get(0, n);
      cout << max(res.positivo_par, res.positivo_impar) << "\n";
    }
  }
  return 0;
}
