option o [ red_green; n; unknown; ] fn main [ var lines := list_break_to_lines(read_lazy(h[0])); var coords := empty(tuple2(int, int)); var max_x := 0; var max_y := 0; for l in lines do [ var c := map(list_break(l, ','), ston); coords +<= mktuple2(c[0], c[1]); max_x := max(max_x, c[0] + 1); max_y := max(max_y, c[1] + 1); ] const mx := max_x; const my := max_y; var rg := array_fill(o.unknown, [ mx, my ]); coords +<= coords[0]; for i := 0 to len(coords) - 1 do [ var c1 := coords[i]; var c2 := coords[i + 1]; var dx := sgn(c2.v1 - c1.v1); var dy := sgn(c2.v2 - c1.v2); rg[c1.v1, c1.v2] := o.red_green; while c1 <> c2 do [ c1.v1 += dx; c1.v2 += dy; rg[c1.v1, c1.v2] := o.red_green; ] ] for y := 0 to my do [ if rg[0, y] is unknown then rg[0, y] := o.n; if rg[mx - 1, y] is unknown then rg[mx - 1, y] := o.n; ] for x := 0 to mx do [ if rg[x, 0] is unknown then rg[x, 0] := o.n; if rg[x, my - 1] is unknown then rg[x, my - 1] := o.n; ] var did_something : bool; again: did_something := false; for y := 0 to my do [ for x := 0 to mx - 1 do [ if rg[x, y] is n, rg[x + 1, y] is unknown then [ rg[x + 1, y] := o.n; did_something := true; ] if rg[mx - x - 1, y] is n, rg[mx - x - 2, y] is unknown then [ rg[mx - x - 2, y] := o.n; did_something := true; ] ] ] for x := 0 to mx do [ for y := 0 to my - 1 do [ if rg[x, y] is n, rg[x, y + 1] is unknown then [ rg[x, y + 1] := o.n; did_something := true; ] if rg[x, my - y - 1] is n, rg[x, my - y - 2] is unknown then [ rg[x, my - y - 2] := o.n; did_something := true; ] ] ] if did_something then goto again; for x := 0 to mx do [ for y := 0 to my do if rg[x, y] is unknown then rg[x, y] := o.red_green; ] var max_rect := 0; for i := 0 to len(coords) do [ for j := i + 1 to len(coords) do [ var x1 := min(coords[i].v1, coords[j].v1); var x2 := max(coords[i].v1, coords[j].v1); var y1 := min(coords[i].v2, coords[j].v2); var y2 := max(coords[i].v2, coords[j].v2); for x := x1 to x2 + 1 do if not rg[x, y1] is red_green or not rg[x, y2] is red_green then goto skip_this; for y := y1 to y2 + 1 do if not rg[x1, y] is red_green or not rg[x2, y] is red_green then goto skip_this; var xd := x2 - x1 + 1; var yd := y2 - y1 + 1; max_rect := max(max_rect, xd * yd); skip_this: ] ] write(h[1], ntos(max_rect) + nl); ]