package main

import (
	"bufio"
	"fmt"
	"log"
	"math"
	"os"
	"strconv"
	"strings"
)

var lyrs map[int]int

func main() {
	inp := StdinToStrings()
	lyrs = make(map[int]int)
	for i := range inp {
		pts := strings.Split(inp[i], ":")
		lyrs[Atoi(pts[0])] = Atoi(strings.TrimSpace(pts[1]))
	}
	fmt.Println("== Part 1 ==")
	fmt.Println("Total Severity:", HitchARide(0, false))

	fmt.Println("== Part 2 ==")
	fmt.Println("Delay", FindNoSeverity(), "picoseconds")
}

func HitchARide(delay int, brk bool) int {
	var tm, top, sev int
	for k := range lyrs {
		if k > top {
			top = k
		}
	}
	for tm = delay; tm <= (top + delay); tm++ {
		if v, ok := lyrs[(tm - delay)]; ok {
			// There is a scanner here, did it see us?
			if FindPos2(tm, v) == 0 {
				sev += (tm * v)
				if brk {
					return -1
				}
			}
		}
	}
	return sev
}

func FindNoSeverity() int {
	maxInt := int((^uint(0) >> 1))
	for i := 0; i < maxInt; i++ {
		if HitchARide(i, true) == 0 {
			return i
		}
	}
	return -1
}

func FindPos(tm, lngth int) int {
	var ret int
	var isAsc bool
	for i := tm; i > 0; i-- {
		if ret == lngth-1 || ret == 0 {
			isAsc = !isAsc
		}
		if isAsc {
			ret++
		} else {
			ret--
		}
	}
	return ret
}

func FindPos2(tm, lngth int) int {
	loop := (lngth - 1) * 2
	pos := (lngth - 1) - int(math.Abs(float64((lngth-1)-(tm%loop))))
	return pos
}

func StdinToStrings() []string {
	var input []string
	scanner := bufio.NewScanner(os.Stdin)
	for scanner.Scan() {
		input = append(input, scanner.Text())
	}
	return input
}

func Atoi(i string) int {
	var ret int
	var err error
	if ret, err = strconv.Atoi(i); err != nil {
		log.Fatal("Invalid Atoi")
	}
	return ret
}
