← Home
```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()
	}
}
```