← Home
For problem statement at 1000-1999/1300-1399/1370-1379/1373/problemG.txt this is a correct solution, but verifier at 1000-1999/1300-1399/1370-1379/1373/verifierG.go ends with mismatch on test 1: expected 0
0
0
1
2
9
10
11
12
13
14
15
16
17
18 got 0
0
0
0
0
4
4
4
4
4
4
4
5
6
7
exit status 1 can you fix the verifier? package main

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

type Node struct {
	maxA int
	lazy int
	maxV int
}

var tree []Node

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

func build(node, l, r int) {
	if l == r {
		tree[node].maxA = l
		tree[node].maxV = 0
		return
	}
	mid := (l + r) / 2
	build(node*2, l, mid)
	build(node*2+1, mid+1, r)
	tree[node].maxA = max(tree[node*2].maxA, tree[node*2+1].maxA)
}

func pushDown(node int) {
	if tree[node].lazy != 0 {
		lz := tree[node].lazy
		tree[node*2].maxA += lz
		tree[node*2].lazy += lz
		tree[node*2+1].maxA += lz
		tree[node*2+1].lazy += lz
		tree[node].lazy = 0
	}
}

func updateRange(node, l, r, ql, qr, val int) {
	if ql <= l && r <= qr {
		tree[node].maxA += val
		tree[node].lazy += val
		return
	}
	pushDown(node)
	mid := (l + r) / 2
	if ql <= mid {
		updateRange(node*2, l, mid, ql, qr, val)
	}
	if qr > mid {
		updateRange(node*2+1, mid+1, r, ql, qr, val)
	}
	tree[node].maxA = max(tree[node*2].maxA, tree[node*2+1].maxA)
}

func updateMaxV(node, l, r, idx, val int) {
	if l == r {
		tree[node].maxV = val
		return
	}
	mid := (l + r) / 2
	if idx <= mid {
		updateMaxV(node*2, l, mid, idx, val)
	} else {
		updateMaxV(node*2+1, mid+1, r, idx, val)
	}
	tree[node].maxV = max(tree[node*2].maxV, tree[node*2+1].maxV)
}

func queryMaxA(node, l, r, ql, qr int) int {
	if ql <= l && r <= qr {
		return tree[node].maxA
	}
	pushDown(node)
	mid := (l + r) / 2
	res := -1
	if ql <= mid {
		res = queryMaxA(node*2, l, mid, ql, qr)
	}
	if qr > mid {
		res = max(res, queryMaxA(node*2+1, mid+1, r, ql, qr))
	}
	return res
}

func abs(x int) int {
	if x < 0 {
		return -x
	}
	return x
}

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

	var n, k, m int
	if _, err := fmt.Fscanf(reader, "%d %d %d\n", &n, &k, &m); err != nil {
		return
	}

	N := 2 * n
	tree = make([]Node, 4*N+1)
	build(1, 1, N)

	c := make([]int, N+1)
	pawns := make(map[int64]bool)

	for i := 0; i < m; i++ {
		var x, y int
		fmt.Fscanf(reader, "%d %d\n", &x, &y)

		v := y + abs(x-k)
		key := int64(x)*300000 + int64(y)

		if pawns[key] {
			delete(pawns, key)
			c[v]--
			if c[v] == 0 {
				updateMaxV(1, 1, N, v, 0)
			}
			updateRange(1, 1, N, 1, v, -1)
		} else {
			pawns[key] = true
			c[v]++
			if c[v] == 1 {
				updateMaxV(1, 1, N, v, v)
			}
			updateRange(1, 1, N, 1, v, 1)
		}

		M := tree[1].maxV
		if M == 0 {
			fmt.Fprintln(writer, 0)
		} else {
			ans := queryMaxA(1, 1, N, 1, M) - 1 - n
			if ans < 0 {
				ans = 0
			}
			fmt.Fprintln(writer, ans)
		}
	}
}