package main

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

const impCounter = 14

type pair [2]int

type pairs [impCounter]pair

func main() {
	if err := myMain(); err != nil {
		log.Println(err)
	}
}

func myMain() error {
	prs, err := parseInput("input.txt")
	if err != nil {
		return err
	}

	solveFirst(prs)
	solveSecond(prs)

	return nil
}

func solveFirst(prs pairs) {
	const start = 9
	ret := [impCounter]int{}

	stack := [][2]int{}
	for i := 0; i < impCounter; i++ {
		if prs[i][0] > 0 {
			stack = append(stack, [2]int{prs[i][1], i})
		} else {
			p := stack[len(stack)-1]
			stack = stack[:len(stack)-1]

			add := start
			for add+p[0]+prs[i][0] > start {
				add--
			}

			ret[p[1]] = add
			ret[i] = add + p[0] + prs[i][0]
		}
	}
	log.Println(ret)
}

func solveSecond(prs pairs) {
	const start = 1
	ret := [impCounter]int{}

	stack := [][2]int{}
	for i := 0; i < impCounter; i++ {
		if prs[i][0] > 0 {
			stack = append(stack, [2]int{prs[i][1], i})
		} else {
			p := stack[len(stack)-1]
			stack = stack[:len(stack)-1]

			add := start
			for add+p[0]+prs[i][0] < start {
				add++
			}

			ret[p[1]] = add
			ret[i] = add + p[0] + prs[i][0]
		}
	}
	log.Println(ret)
}

func parseInput(fileName string) (pairs, error) {
	ret := pairs{}
	fd, err := os.Open(fileName)
	if err != nil {
		return ret, err
	}
	defer fd.Close()

	const (
		impLength = 18
		offset0   = 5
		offset1   = 15
	)

	buf := bufio.NewScanner(fd)
	for line, counter := 0, 0; buf.Scan(); line++ {
		if line == impLength*counter+offset0 {
			ret[counter][0], err = strconv.Atoi(strings.Split(buf.Text(), " ")[2])
			if err != nil {
				log.Println(err)
			}
		}
		if line == impLength*counter+offset1 {
			ret[counter][1], err = strconv.Atoi(strings.Split(buf.Text(), " ")[2])
			if err != nil {
				log.Println(err)
			}
			counter++
		}
	}

	return ret, nil
}