← Home
For problem statement at 1000-1999/1500-1599/1580-1589/1584/problemD.txt this is a correct solution, but verifier at 1000-1999/1500-1599/1580-1589/1584/verifierD.go ends with Problem D is interactive and cannot be automatically verified. can you fix the verifier? package main

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

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

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

	t := scanInt64()
	for tc := int64(0); tc < t; tc++ {
		n := scanInt64()

		cache := make(map[int64]int64)
		query := func(l, r int64) int64 {
			if l == 1 {
				if val, ok := cache[r]; ok {
					return val
				}
			}
			fmt.Fprintf(writer, "? %d %d\n", l, r)
			writer.Flush()
			res := scanInt64()
			if l == 1 {
				cache[r] = res
			}
			return res
		}

		T := query(1, n)

		var low, high int64 = 1, n
		var ans_i int64 = 1
		for low <= high {
			mid := low + (high-low)/2
			if query(1, mid) == 0 {
				ans_i = mid
				low = mid + 1
			} else {
				high = mid - 1
			}
		}

		T1 := query(ans_i+1, n)
		j := T - T1 + ans_i + 1

		len1 := j - ans_i
		rem := T - len1*(len1-1)/2

		var lowM, highM int64 = 1, 2000000000
		var M int64 = 1
		for lowM <= highM {
			mid := lowM + (highM-lowM)/2
			val := mid * (mid - 1) / 2
			if val == rem {
				M = mid
				break
			} else if val < rem {
				lowM = mid + 1
			} else {
				highM = mid - 1
			}
		}

		k := j + M - 1
		fmt.Fprintf(writer, "! %d %d %d\n", ans_i, j, k)
		writer.Flush()
	}
}