For problem statement at 1000-1999/1700-1799/1740-1749/1749/problemF.txt this is a correct solution, but verifier at 1000-1999/1700-1799/1740-1749/1749/verifierF.go ends with case 3 failed: expected
14
18
got
8
18
input:
7
2 1
3 2
4 2
5 4
6 5
7 1
5
2 5 5 4 2
2 5 1 6 2
2 7 5 8 1
1 1
1 2
exit status 1 can you fix the verifier? package main
import (
"bufio"
"fmt"
"os"
)
var in []int
var out []int
var depth []int
var up [][]int
var fenwicks [21]*Fenwick
var timer int
var adj [][]int
type Fenwick struct {
tree []int
}
func (f *Fenwick) add(i, delta int) {
for ; i < len(f.tree); i += i & -i {
f.tree[i] += delta
}
}
func (f *Fenwick) query(i int) int {
sum := 0
for ; i > 0; i -= i & -i {
sum += f.tree[i]
}
return sum
}
func (f *Fenwick) queryRange(l, r int) int {
if l > r {
return 0
}
return f.query(r) - f.query(l-1)
}
func add_diff(node, r, val int) {
if node == 0 {
return
}
fenwicks[r].add(in[node], val)
}
func get_ancestor(x, j int) int {
for i := 0; i < 5; i++ {
if (j>>i)&1 == 1 {
x = up[x][i]
if x == 0 {
break
}
}
}
return x
}
func get_lca(u, v int) int {
if depth[u] < depth[v] {
u, v = v, u
}
diff := depth[u] - depth[v]
for i := 0; i < 19; i++ {
if (diff>>i)&1 == 1 {
u = up[u][i]
}
}
if u == v {
return u
}
for i := 18; i >= 0; i-- {
if up[u][i] != up[v][i] {
u = up[u][i]
v = up[v][i]
}
}
return up[u][0]
}
type Frame struct {
u, p, d, edgeIdx int
}
func build_tree(root, n int) {
st := make([]Frame, 0, n)
st = append(st, Frame{root, 0, 0, 0})
for len(st) > 0 {
idx := len(st) - 1
u := st[idx].u
p := st[idx].p
d := st[idx].d
e := st[idx].edgeIdx
if e == 0 {
timer++
in[u] = timer
depth[u] = d
up[u][0] = p
for i := 1; i < 19; i++ {
if up[u][i-1] != 0 {
up[u][i] = up[up[u][i-1]][i-1]
}
}
}
if e < len(adj[u]) {
v := adj[u][e]
st[idx].edgeIdx++
if v != p {
st = append(st, Frame{v, u, d+1, 0})
}
} else {
out[u] = timer
st = st[:idx]
}
}
}
func readInt(sc *bufio.Scanner) int {
sc.Scan()
res := 0
b := sc.Bytes()
for _, ch := range b {
res = res*10 + int(ch-'0')
}
return res
}
func main() {
sc := bufio.NewScanner(os.Stdin)
sc.Split(bufio.ScanWords)
buf := make([]byte, 1024*1024)
sc.Buffer(buf, 10*1024*1024)
n := readInt(sc)
in = make([]int, n+1)
out = make([]int, n+1)
depth = make([]int, n+1)
up = make([][]int, n+1)
for i := range up {
up[i] = make([]int, 19)
}
adj = make([][]int, n+1)
for i := 0; i <= 20; i++ {
fenwicks[i] = &Fenwick{tree: make([]int, n+1)}
}
for i := 0; i < n-1; i++ {
u := readInt(sc)
v := readInt(sc)
adj[u] = append(adj[u], v)
adj[v] = append(adj[v], u)
}
build_tree(1, n)
m := readInt(sc)
writer := bufio.NewWriter(os.Stdout)
defer writer.Flush()
for i := 0; i < m; i++ {
typ := readInt(sc)
if typ == 1 {
v := readInt(sc)
ans := 0
for j := 0; j <= 20; j++ {
anc := get_ancestor(v, j)
if anc == 0 {
break
}
for radius := j; radius <= 20; radius++ {
ans += fenwicks[radius].queryRange(in[anc], out[anc])
}
}
fmt.Fprintln(writer, ans)
} else {
u := readInt(sc)
v := readInt(sc)
k := readInt(sc)
d := readInt(sc)
a := get_lca(u, v)
add_diff(u, d, k)
add_diff(v, d, k)
add_diff(a, d, -k)
p_a := up[a][0]
if p_a != 0 {
add_diff(p_a, d, -k)
}
if d >= 1 {
if u != a {
add_diff(u, d-1, -k)
add_diff(a, d-1, k)
}
if v != a {
add_diff(v, d-1, -k)
add_diff(a, d-1, k)
}
}
for j := 1; j <= d; j++ {
p := get_ancestor(a, j)
c := get_ancestor(a, j-1)
if d-j >= 0 {
if p != 0 {
add_diff(p, d-j, k)
p_p := up[p][0]
if p_p != 0 {
add_diff(p_p, d-j, -k)
}
}
}
if d-j-1 >= 0 {
if c != 0 {
add_diff(c, d-j-1, -k)
if p != 0 {
add_diff(p, d-j-1, k)
}
}
}
}
}
}
}