← Home
package main

import (
	"fmt"
	"io"
	"os"
)

func main() {
	b, err := io.ReadAll(os.Stdin)
	if err != nil {
		return
	}

	var n int
	idx := 0

	for idx < len(b) && b[idx] <= ' ' {
		idx++
	}
	for idx < len(b) && b[idx] > ' ' {
		n = n*10 + int(b[idx]-'0')
		idx++
	}

	lengths := make([]int64, n)
	for i := 0; i < n; i++ {
		for idx < len(b) && b[idx] <= ' ' {
			idx++
		}
		var l int64
		for idx < len(b) && b[idx] > ' ' {
			l = l*10 + int64(b[idx]-'0')
			idx++
		}
		lengths[i] = l
	}

	types := make([]byte, n)
	for i := 0; i < n; i++ {
		for idx < len(b) && b[idx] <= ' ' {
			idx++
		}
		if idx < len(b) {
			types[i] = b[idx]
			idx++
		}
	}

	var opt1_cap int64 = 0
	var opt2_cap int64 = 0
	var seen_water bool = false
	var total_time int64 = 0
	var stamina int64 = 0

	for i := 0; i < n; i++ {
		l := lengths[i]
		t := types[i]

		total_time += l
		stamina -= l

		if t == 'W' {
			opt1_cap += 2 * l
			seen_water = true
		} else if t == 'G' {
			opt2_cap += 2 * l
		}

		if stamina < 0 {
			req := -stamina

			if req > 0 && opt1_cap > 0 {
				take := req
				if take > opt1_cap {
					take = opt1_cap
				}
				opt1_cap -= take
				total_time += take * 1
				stamina += take
				req -= take
			}

			if req > 0 && opt2_cap > 0 {
				take := req
				if take > opt2_cap {
					take = opt2_cap
				}
				opt2_cap -= take
				total_time += take * 2
				stamina += take
				req -= take
			}

			if req > 0 {
				if seen_water {
					total_time += req * 3
					stamina += req
					req = 0
				} else {
					total_time += req * 5
					stamina += req
					req = 0
				}
			}
		}
	}

	fmt.Println(total_time)
}