← Home
package main

import (
	"bufio"
	"fmt"
	"os"
)

type SegmentTree struct {
	n    int
	tree []int
	lazy []int
}

func NewSegmentTree(n int) *SegmentTree {
	return &SegmentTree{
		n:    n,
		tree: make([]int, 4*n),
		lazy: make([]int, 4*n),
	}
}

func (st *SegmentTree) push(node int) {
	if st.lazy[node] != 0 {
		st.tree[2*node] += st.lazy[node]
		st.lazy[2*node] += st.lazy[node]
		st.tree[2*node+1] += st.lazy[node]
		st.lazy[2*node+1] += st.lazy[node]
		st.lazy[node] = 0
	}
}

func (st *SegmentTree) update(node, l, r, ql, qr, val int) {
	if ql > r || qr < l {
		return
	}
	if ql <= l && r <= qr {
		st.tree[node] += val
		st.lazy[node] += val
		return
	}
	st.push(node)
	mid := (l + r) / 2
	st.update(2*node, l, mid, ql, qr, val)
	st.update(2*node+1, mid+1, r, ql, qr, val)
	if st.tree[2*node] > st.tree[2*node+1] {
		st.tree[node] = st.tree[2*node]
	} else {
		st.tree[node] = st.tree[2*node+1]
	}
}

func (st *SegmentTree) query() int {
	node := 1
	l, r := 0, st.n-1
	for l != r {
		st.push(node)
		mid := (l + r) / 2
		if st.tree[2*node] >= st.tree[2*node+1] {
			node = 2 * node
			r = mid
		} else {
			node = 2*node + 1
			l = mid + 1
		}
	}
	return l
}

func main() {
	reader := bufio.NewReader(os.Stdin)
	writer := bufio.NewWriter(os.Stdout)
	defer writer.Flush()

	var n, q int
	fmt.Fscan(reader, &n, &q)

	length := 2*n + 1
	p := make([]int, length+1)
	pos := make([]int, length+1)

	st := NewSegmentTree(length)

	addInterval := func(u, v, val int) {
		if u <= v {
			st.update(1, 0, length-1, u, v, val)
		} else {
			st.update(1, 0, length-1, u, length-1, val)
			st.update(1, 0, length-1, 0, v, val)
		}
	}

	updateVal := func(i, val int) {
		if p[i] > i {
			addInterval(i, p[i]-1, val)
		} else if p[i] < i {
			addInterval(i, length-1, val)
			addInterval(0, p[i]-1, val)
		}
	}

	for i := 1; i <= length; i++ {
		fmt.Fscan(reader, &p[i])
		pos[p[i]] = i
	}

	for i := 1; i <= length; i++ {
		updateVal(i, 1)
	}

	for i := 0; i < q; i++ {
		var u, v int
		fmt.Fscan(reader, &u, &v)

		updateVal(u, -1)
		updateVal(v, -1)

		p[u], p[v] = p[v], p[u]
		pos[p[u]] = u
		pos[p[v]] = v

		updateVal(u, 1)
		updateVal(v, 1)

		maxVal := st.tree[1]
		if maxVal <= n {
			fmt.Fprintln(writer, st.query())
		} else {
			fmt.Fprintln(writer, -1)
		}
	}
}