← Home
For problem statement at 1000-1999/1900-1999/1940-1949/1942/problemF.txt this is a correct solution, but verifier at 1000-1999/1900-1999/1940-1949/1942/verifierF.go ends with failed to build reference: REFERENCE_SOURCE_PATH not set
exit status 1 can you fix the verifier? package main

import (
	"bufio"
	"fmt"
	"math"
	"os"
	"strconv"
)

const INF int64 = 2000000000000000000

type Node struct {
	is_leaf bool
	a_val   int64
	M       int64
	T1      int64
}

var tree []Node

func isqrt(n int64) int64 {
	if n == 0 {
		return 0
	}
	x := int64(math.Sqrt(float64(n)))
	for (x+1)*(x+1) <= n {
		x++
	}
	for x*x > n {
		x--
	}
	return x
}

func req_leaf(a_val int64, v int64) int64 {
	if v > 2000000000 {
		return INF
	}
	ans := v*v - a_val
	if ans < 0 {
		return 0
	}
	if ans > INF {
		return INF
	}
	return ans
}

func req(node int, v int64) int64 {
	if v >= INF {
		return INF
	}
	if v <= tree[node].M {
		return 0
	}
	if v == tree[node].M+1 {
		return tree[node].T1
	}
	if tree[node].is_leaf {
		return req_leaf(tree[node].a_val, v)
	}

	mid := req(2*node+1, v)
	if mid >= INF {
		return INF
	}
	return req(2*node, mid)
}

func eval(node int, x int64) int64 {
	if x < tree[node].T1 {
		return tree[node].M
	}
	if tree[node].is_leaf {
		return isqrt(tree[node].a_val + x)
	}

	v := tree[node].M + 1
	for {
		if req(node, v+1) <= x {
			v++
		} else {
			break
		}
	}
	return v
}

func pull(node int) {
	L := 2 * node
	R := 2*node + 1

	tree[node].M = eval(R, tree[L].M)
	mid := req(R, tree[node].M+1)
	tree[node].T1 = req(L, mid)
	tree[node].is_leaf = false
}

func build(node, l, r int, a []int64) {
	if l == r {
		tree[node].is_leaf = true
		tree[node].a_val = a[l]
		tree[node].M = isqrt(a[l])
		tree[node].T1 = req_leaf(a[l], tree[node].M+1)
		return
	}
	mid := (l + r) / 2
	build(2*node, l, mid, a)
	build(2*node+1, mid+1, r, a)
	pull(node)
}

func update(node, l, r int, k int, x int64) {
	if l == r {
		tree[node].a_val = x
		tree[node].M = isqrt(x)
		tree[node].T1 = req_leaf(x, tree[node].M+1)
		return
	}
	mid := (l + r) / 2
	if k <= mid {
		update(2*node, l, mid, k, x)
	} else {
		update(2*node+1, mid+1, r, k, x)
	}
	pull(node)
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)
	scanner.Buffer(make([]byte, 1024*1024), 10*1024*1024)

	nextInt := func() int {
		scanner.Scan()
		res, _ := strconv.Atoi(scanner.Text())
		return res
	}

	nextInt64 := func() int64 {
		scanner.Scan()
		res, _ := strconv.ParseInt(scanner.Text(), 10, 64)
		return res
	}

	if !scanner.Scan() {
		return
	}
	n, _ := strconv.Atoi(scanner.Text())
	q := nextInt()

	a := make([]int64, n+1)
	for i := 1; i <= n; i++ {
		a[i] = nextInt64()
	}

	tree = make([]Node, 4*n+1)
	build(1, 1, n, a)

	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	for i := 0; i < q; i++ {
		k := nextInt()
		x := nextInt64()
		update(1, 1, n, k, x)
		fmt.Fprintln(out, tree[1].M)
	}
}