← Home
For problem statement at 1000-1999/1700-1799/1770-1779/1774/problemF2.txt this is a correct solution, but verifier at 1000-1999/1700-1799/1770-1779/1774/verifierF2.go ends with All 51 tests passed. can you fix the verifier? ```go
package main

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

const MOD = 998244353
const INF = 1000000001

func readInt(reader *bufio.Reader) int {
	var n int
	var c byte
	for {
		c, _ = reader.ReadByte()
		if c >= '0' && c <= '9' {
			break
		}
	}
	for {
		n = n*10 + int(c-'0')
		c, _ = reader.ReadByte()
		if c < '0' || c > '9' {
			break
		}
	}
	return n
}

type Op struct {
	typ int
	val int
}

type WItem struct {
	idx int
	val int64
}

func main() {
	reader := bufio.NewReaderSize(os.Stdin, 65536)
	n := readInt(reader)

	ops := make([]Op, n+1)
	for i := 1; i <= n; i++ {
		ops[i].typ = readInt(reader)
		if ops[i].typ != 3 {
			ops[i].val = readInt(reader)
		}
	}

	D := make([]int64, n+1)
	D[0] = 0
	for i := 1; i <= n; i++ {
		if ops[i].typ == 1 {
			D[i] = D[i-1]
		} else if ops[i].typ == 2 {
			D[i] = D[i-1] + int64(ops[i].val)
			if D[i] > INF {
				D[i] = INF
			}
		} else {
			D[i] = 2 * D[i-1]
			if D[i] > INF {
				D[i] = INF
			}
		}
	}

	var W_global []WItem
	for i := 1; i <= n; i++ {
		if ops[i].typ == 3 && D[i-1] > 0 && D[i-1] <= 1000000000 {
			W_global = append(W_global, WItem{idx: i, val: D[i-1]})
		}
	}

	m := len(W_global)
	S := make([]int64, m+1)
	for i := 1; i <= m; i++ {
		S[i] = S[i-1] + W_global[i-1].val
	}

	power2 := make([]int, n+1)
	power2[0] = 1
	for i := 1; i <= n; i++ {
		power2[i] = (power2[i-1] * 2) % MOD
	}

	ans := 0
	var fixedDamage int64 = 0
	Z := 0
	ptr := m

	for i := n; i >= 1; i-- {
		if ops[i].typ == 2 {
			fixedDamage += int64(ops[i].val)
			if fixedDamage > INF {
				fixedDamage = INF
			}
		} else if ops[i].typ == 3 {
			if D[i-1] == 0 {
				Z++
			}
			if ptr > 0 && W_global[ptr-1].idx == i {
				ptr--
			}
		} else if ops[i].typ == 1 {
			target := int64(ops[i].val) - fixedDamage
			if target <= 0 {
				continue
			}

			var count int64 = 0
			currTarget := target

			for j := m - 1; j >= ptr; j-- {
				sumRemInc := S[j+1] - S[ptr]
				if currTarget > sumRemInc {
					count = (count + int64(power2[j-ptr+1])) % MOD
					currTarget = 0
					break
				}
				val := W_global[j].val
				if currTarget <= val {
					continue
				} else {
					count = (count + int64(power2[j-ptr])) % MOD
					currTarget -= val
				}
			}
			if currTarget > 0 {
				count = (count + 1) % MOD
			}

			term := (count * int64(power2[Z])) % MOD
			ans = (ans + int(term)) % MOD
		}
	}

	fmt.Println(ans)
}
```