← Home
For problem statement at 1000-1999/1500-1599/1580-1589/1580/problemC.txt this is a correct solution, but verifier at 1000-1999/1500-1599/1580-1589/1580/verifierC.go ends with  can you fix the verifier? package main

import (
	"io"
	"os"
	"strconv"
)

const B = 450

func nextInt(data []byte, idx *int) int {
	n := len(data)
	for *idx < n {
		c := data[*idx]
		if c >= '0' && c <= '9' {
			break
		}
		*idx++
	}
	v := 0
	for *idx < n {
		c := data[*idx]
		if c < '0' || c > '9' {
			break
		}
		v = v*10 + int(c-'0')
		*idx++
	}
	return v
}

func main() {
	data, _ := io.ReadAll(os.Stdin)
	idx := 0

	n := nextInt(data, &idx)
	m := nextInt(data, &idx)

	x := make([]int, n+1)
	y := make([]int, n+1)
	per := make([]int, n+1)

	hasSmall := make([]bool, B+1)
	smallPeriods := make([]int, 0, B)

	for i := 1; i <= n; i++ {
		xi := nextInt(data, &idx)
		yi := nextInt(data, &idx)
		p := xi + yi
		x[i] = xi
		y[i] = yi
		per[i] = p
		if p <= B && !hasSmall[p] {
			hasSmall[p] = true
			smallPeriods = append(smallPeriods, p)
		}
	}

	sdiff := make([][]int, B+1)
	for _, p := range smallPeriods {
		sdiff[p] = make([]int, p)
	}

	rem := make([]int, B+1)
	curr := make([]int, B+1)
	smallTotal := 0

	start := make([]int, n+1)
	diff := make([]int, m+3)
	curLarge := 0

	out := make([]byte, 0, m*8)

	for day := 1; day <= m; day++ {
		op := nextInt(data, &idx)
		k := nextInt(data, &idx)

		for i := 0; i < len(smallPeriods); i++ {
			p := smallPeriods[i]
			nr := rem[p] + 1
			if nr == p {
				rem[p] = 0
				old := curr[p]
				nv := sdiff[p][0]
				curr[p] = nv
				smallTotal += nv - old
			} else {
				rem[p] = nr
				d := sdiff[p][nr]
				curr[p] += d
				smallTotal += d
			}
		}

		pk := per[k]
		if op == 1 {
			start[k] = day
			if pk <= B {
				d := sdiff[pk]
				l := (day + x[k]) % pk
				length := y[k]
				end := l + length
				if end <= pk {
					d[l]++
					if end < pk {
						d[end]--
					}
				} else {
					d[l]++
					d[0]++
					d[end-pk]--
				}
				r := rem[pk]
				if (end <= pk && r >= l && r < end) || (end > pk && (r >= l || r < end-pk)) {
					curr[pk]++
					smallTotal++
				}
			} else {
				step := pk
				yy := y[k]
				for l := day + x[k]; l <= m; l += step {
					r := l + yy
					if r > m+1 {
						r = m + 1
					}
					diff[l]++
					diff[r]--
				}
			}
		} else {
			s := start[k]
			start[k] = 0
			if pk <= B {
				d := sdiff[pk]
				l := (s + x[k]) % pk
				length := y[k]
				end := l + length
				if end <= pk {
					d[l]--
					if end < pk {
						d[end]++
					}
				} else {
					d[l]--
					d[0]--
					d[end-pk]++
				}
				r := rem[pk]
				if (end <= pk && r >= l && r < end) || (end > pk && (r >= l || r < end-pk)) {
					curr[pk]--
					smallTotal--
				}
			} else {
				step := pk
				yy := y[k]
				for l := s + x[k]; l <= m; l += step {
					r := l + yy
					if r > m+1 {
						r = m + 1
					}
					L := l
					if L < day {
						L = day
					}
					if L < r {
						diff[L]--
						diff[r]++
					}
				}
			}
		}

		curLarge += diff[day]
		out = strconv.AppendInt(out, int64(curLarge+smallTotal), 10)
		out = append(out, '\n')
	}

	os.Stdout.Write(out)
}