← Home
For problem statement at 0-999/600-699/620-629/625/problemE.txt this is a correct solution, but verifier at 0-999/600-699/620-629/625/verifierE.go ends with Test 3 wrong answer expected [1 3] got [3 1]

exit status 1 can you fix the verifier? ```go
package main

import (
	"bufio"
	"container/heap"
	"fmt"
	"os"
	"sort"
	"strconv"
	"strings"
)

type Event struct {
	T    int64
	Type int
	i    int
	j    int
	v_i  int
	v_j  int
}

type PQ []Event

func (pq PQ) Len() int { return len(pq) }
func (pq PQ) Less(i, j int) bool {
	if pq[i].T != pq[j].T {
		return pq[i].T < pq[j].T
	}
	return pq[i].Type < pq[j].Type
}
func (pq PQ) Swap(i, j int) { pq[i], pq[j] = pq[j], pq[i] }
func (pq *PQ) Push(x interface{}) {
	*pq = append(*pq, x.(Event))
}
func (pq *PQ) Pop() interface{} {
	old := *pq
	n := len(old)
	item := old[n-1]
	*pq = old[0 : n-1]
	return item
}

type Frog struct {
	id        int64
	p         int64
	a         int64
	C         int64
	laps      int64
	next      int
	prev      int
	active    bool
	version   int
	knockouts int64
	orig_idx  int
}

var frogs []Frog
var n int64
var m int64

func Jumps(id int64, n int64, T int64) int64 {
	return (T - id + n) / n
}

func floorDiv(a, b int64) int64 {
	if a >= 0 {
		return a / b
	}
	return (a - b + 1) / b
}

func ceilDiv(a, b int64) int64 {
	if a >= 0 {
		return (a + b - 1) / b
	}
	return a / b
}

func catchTime(i, j int, T_curr int64) int64 {
	if frogs[i].a == 0 {
		return -1
	}
	R_min := floorDiv(T_curr-frogs[i].id, n) + 2

	delta_j := int64(0)
	if frogs[i].id < frogs[j].id {
		delta_j = -1
	}

	Delta := frogs[i].a - frogs[j].a
	K := frogs[j].C + frogs[i].laps*m - frogs[i].C + delta_j*frogs[j].a

	var R int64
	if Delta > 0 {
		R = ceilDiv(K, Delta)
		if R < R_min {
			R = R_min
		}
	} else {
		if R_min*Delta >= K {
			R = R_min
		} else {
			return -1
		}
	}

	return frogs[i].id + (R-1)*n
}

func updateState(i int, T int64) {
	J := Jumps(frogs[i].id, n, T)
	X := frogs[i].C + J*frogs[i].a
	frogs[i].a -= frogs[i].knockouts
	if frogs[i].a < 0 {
		frogs[i].a = 0
	}
	frogs[i].C = X - J*frogs[i].a
	frogs[i].knockouts = 0
	frogs[i].version++
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)

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

	if !scanner.Scan() {
		return
	}
	n = 0
	nStr := scanner.Text()
	n, _ = strconv.ParseInt(nStr, 10, 64)
	m = scanInt64()

	frogs = make([]Frog, n)
	for i := int64(0); i < n; i++ {
		p := scanInt64()
		a := scanInt64()
		frogs[i] = Frog{
			id:        i + 1,
			p:         p,
			a:         a,
			active:    true,
			orig_idx:  int(i + 1),
		}
	}

	sort.Slice(frogs, func(i, j int) bool {
		return frogs[i].p < frogs[j].p
	})

	for k := 0; k < int(n); k++ {
		frogs[k].prev = (k - 1 + int(n)) % int(n)
		frogs[k].next = (k + 1) % int(n)
		if k == int(n)-1 {
			frogs[k].laps = 1
		} else {
			frogs[k].laps = 0
		}
		frogs[k].C = frogs[k].p
	}

	pq := &PQ{}
	heap.Init(pq)

	for k := 0; k < int(n); k++ {
		T := catchTime(k, frogs[k].next, 0)
		if T != -1 {
			heap.Push(pq, Event{T, 0, k, frogs[k].next, 0, 0})
		}
	}

	activeCount := int(n)

	for pq.Len() > 0 {
		if activeCount <= 1 {
			break
		}
		ev := heap.Pop(pq).(Event)

		if ev.Type == 0 {
			i := ev.i
			j := ev.j
			if !frogs[i].active || !frogs[j].active || frogs[i].next != j {
				continue
			}
			if frogs[i].version != ev.v_i || frogs[j].version != ev.v_j {
				continue
			}

			frogs[j].active = false
			activeCount--
			if activeCount <= 1 {
				break
			}

			nxt := frogs[j].next
			frogs[i].next = nxt
			frogs[nxt].prev = i
			frogs[i].laps += frogs[j].laps
			frogs[i].knockouts++

			T_new := catchTime(i, nxt, ev.T-1)
			if T_new != -1 {
				heap.Push(pq, Event{T_new, 0, i, nxt, frogs[i].version, frogs[nxt].version})
			}

			heap.Push(pq, Event{ev.T, 1, i, 0, frogs[i].version, 0})
		} else {
			i := ev.i
			if !frogs[i].active || frogs[i].version != ev.v_i {
				continue
			}
			if frogs[i].knockouts > 0 {
				updateState(i, ev.T)
				
				prv := frogs[i].prev
				T_prv := catchTime(prv, i, ev.T)
				if T_prv != -1 {
					heap.Push(pq, Event{T_prv, 0, prv, i, frogs[prv].version, frogs[i].version})
				}
				
				nxt := frogs[i].next
				T_nxt := catchTime(i, nxt, ev.T)
				if T_nxt != -1 {
					heap.Push(pq, Event{T_nxt, 0, i, nxt, frogs[i].version, frogs[nxt].version})
				}
			}
		}
	}

	fmt.Println(activeCount)
	var out []string
	for _, f := range frogs {
		if f.active {
			out = append(out, strconv.Itoa(f.orig_idx))
		}
	}
	fmt.Println(strings.Join(out, " "))
}
```