← Home
For problem statement at 0-999/800-899/870-879/875/problemD.txt this is a correct solution, but verifier at 0-999/800-899/870-879/875/verifierD.go ends with All 100 tests passed can you fix the verifier? package main

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

func main() {
	reader := bufio.NewReader(os.Stdin)
	var n int
	fmt.Fscan(reader, &n)

	a := make([]int, n+1)
	for i := 1; i <= n; i++ {
		fmt.Fscan(reader, &a[i])
	}

	lastPos := make([]int, 30)
	lastValPos := make(map[int]int)
	badLeft := make([]int, n+1)

	for i := 1; i <= n; i++ {
		bl := 0
		for k := 0; k < 30; k++ {
			if (a[i] & (1 << k)) == 0 {
				if lastPos[k] > bl {
					bl = lastPos[k]
				}
			}
		}
		if pos, exists := lastValPos[a[i]]; exists {
			if pos > bl {
				bl = pos
			}
		}
		badLeft[i] = bl

		for k := 0; k < 30; k++ {
			if (a[i] & (1 << k)) != 0 {
				lastPos[k] = i
			}
		}
		lastValPos[a[i]] = i
	}

	nextPos := make([]int, 30)
	for k := 0; k < 30; k++ {
		nextPos[k] = n + 1
	}
	badRight := make([]int, n+1)

	for i := n; i >= 1; i-- {
		br := n + 1
		for k := 0; k < 30; k++ {
			if (a[i] & (1 << k)) == 0 {
				if nextPos[k] < br {
					br = nextPos[k]
				}
			}
		}
		badRight[i] = br

		for k := 0; k < 30; k++ {
			if (a[i] & (1 << k)) != 0 {
				nextPos[k] = i
			}
		}
	}

	var invalid int64
	for i := 1; i <= n; i++ {
		invalid += int64(i-badLeft[i]) * int64(badRight[i]-i)
	}

	totalSubarrays := int64(n) * int64(n+1) / 2
	validPairs := totalSubarrays - invalid

	fmt.Println(validPairs)
}