fn main [ const chtod := "URDL"; const d2dx := [ 0, 1, 0, -1 ]; const d2dy := [ -1, 0, 1, 0 ]; var a := infinite(infinite(byte, 0)); var xp, yp := 0, 0; var min_x, min_y := 0, 0; var max_x, max_y := 0, 0; var lines := list_break_to_lines(read_lazy(h[0])); for pass in [ false, true ] do [ for line in lines do [ var l := list_break_whitespace(line); var dx := d2dx[list_search(chtod, l[0][0])]; var dy := d2dy[list_search(chtod, l[0][0])]; var n := ston(l[1]); for i := 0 to n do [ xp += dx; yp += dy; if not pass then [ min_x := min(min_x, xp); min_y := min(min_y, yp); max_x := max(max_x, xp); max_y := max(max_y, yp); ] else [ a[yp - min_y][xp - min_x] := 1; ] ] ] ] var pending := empty(tuple2(int, int)); for j := min_y to max_y + 1 do [ pending +<= mktuple2(min_x, j); pending +<= mktuple2(max_x, j); ] for i := min_x to max_x + 1 do [ pending +<= mktuple2(i, min_y); pending +<= mktuple2(i, max_y); ] while len_greater_than(pending, 0) do [ var p := pending[len(pending) - 1]; pending := pending[ .. len(pending) - 1]; if a[p.v2 - min_y][p.v1 - min_x] <> 0 then continue; a[p.v2 - min_y][p.v1 - min_x] := 2; for d := 0 to 4 do [ var dx := d2dx[d]; var dy := d2dy[d]; if p.v1 + dx < min_x or p.v1 + dx > max_x then continue; if p.v2 + dy < min_y or p.v2 + dy > max_y then continue; if a[p.v2 + dy - min_y][p.v1 + dx - min_x] <> 0 then continue; pending +<= mktuple2(p.v1 + dx, p.v2 + dy); ] ] var sum := 0; for j := min_y to max_y + 1 do [ for i := min_x to max_x + 1 do [ if a[j - min_y][i - min_x] <> 2 then sum += 1; ] ] write(h[1], ntos(sum) + nl); ]