```go
package main
import (
"bufio"
"fmt"
"os"
)
type node struct {
even, odd int64
}
var tree []node
var a []int
func max(x, y int64) int64 {
if x > y {
return x
}
return y
}
func combine(left, right node) node {
od := max(left.even+right.odd, left.odd-right.even)
ev := max(left.even+right.even, left.odd-right.odd)
return node{ev, od}
}
func build(idx, l, r int) {
if l == r {
tree[idx] = node{0, int64(a[l])}
return
}
mid := (l + r) / 2
build(2*idx, l, mid)
build(2*idx+1, mid+1, r)
tree[idx] = combine(tree[2*idx], tree[2*idx+1])
}
func update(idx, l, r, pos int, val int64) {
if l == r {
tree[idx] = node{0, val}
return
}
mid := (l + r) / 2
if pos <= mid {
update(2*idx, l, mid, pos, val)
} else {
update(2*idx+1, mid+1, r, pos, val)
}
tree[idx] = combine(tree[2*idx], tree[2*idx+1])
}
func main() {
in := bufio.NewScanner(os.Stdin)
in.Split(bufio.ScanWords)
readInt := func() int {
in.Scan()
var x int
fmt.Sscan(in.Text(), &x)
return x
}
t := readInt()
for ; t > 0; t-- {
n := readInt()
q := readInt()
a = make([]int, n+1)
for i := 1; i <= n; i++ {
a[i] = readInt()
}
tree = make([]node, 4*(n+1))
build(1, 1, n)
ans := []int64{}
ans = append(ans, max(tree[1].even, tree[1].odd))
for i := 0; i < q; i++ {
l := readInt()
r := readInt()
temp := a[l]
a[l] = a[r]
a[r] = temp
update(1, 1, n, l, int64(a[l]))
update(1, 1, n, r, int64(a[r]))
ans = append(ans, max(tree[1].even, tree[1].odd))
}
for i, v := range ans {
if i > 0 {
fmt.Print(" ")
}
fmt.Print(v)
}
fmt.Println()
}
}
```