|  | def perimeter(pts):
    n = 0
    for i in range(len(pts)):
        dist = pts[i - 1] - pts[i]
        n += abs(dist.real) + abs(dist.imag)
    return int(n)
def area(pts):
    # shoelace method
    a = 0
    for i in range(len(pts)):
        p1, p2 = pts[i - 1], pts[i]
        a += p1.real * p2.imag - p2.real * p1.imag
    return int(a / 2)
text = open(0).read()
pts = [0]
for line in text.splitlines():
    d, n, _ = line.split()
    n = int(n)
    d = 1j ** 'RDLU'.index(d)
    pts.append(pts[-1] + d * n)
print(area(pts) + perimeter(pts) // 2 + 1)
pts = [0]
for line in text.splitlines():
    _, _, s = line.split()
    n = int(s[2:7], 16)
    d = 1j ** int(s[7])
    pts.append(pts[-1] + d * n)
print(area(pts) + perimeter(pts) // 2 + 1)
# def render(graph, default='.'):
#     xmin, *_, xmax = sorted(int(p.real) for p in graph)
#     ymin, *_, ymax = sorted(int(p.imag) for p in graph)
#     out = ''
#     for y in range(ymin, ymax + 1):
#         for x in range(xmin, xmax + 1):
#             out += graph.get(complex(x, y), default)
#         out += '\n'
#     return out
# def connected_components(graph):
#     groups = []
#     while graph:
#         seen = set()
#         edge = {graph.pop()}
#         while edge:
#             seen |= edge
#             edge = {pp + ss for pp in edge for ss in [1, -1, 1j, -1j] if pp + ss in graph if pp + ss not in seen}
#         groups.append(seen)
#         graph -= seen
#     return groups
# def get_solid(walls):
#     xmin, *_, xmax = sorted(int(p.real) for p in walls)
#     ymin, *_, ymax = sorted(int(p.imag) for p in walls)
#     mesh = {complex(x, y) for x in range(xmin, xmax + 1) for y in range(ymin, ymax + 1)}
#     void = mesh - walls
#     groups = connected_components(void)
#     border = lambda p: p.real in {xmin, xmax} or p.imag in {ymin, ymax}
#     inside = {p for g in groups if not any(border(p) for p in g) for p in g}
#     solid = inside | walls
#     return solid
# def solve1():
#     pos = 0
#     walls = {pos}
#     for line in text.splitlines():
#         d, n, _ = line.split()
#         dirx = 1j ** 'RDLU'.index(d)
#         goal = pos + dirx * int(n)
#         while pos != goal:
#             pos += dirx
#             walls.add(pos)
#     solid = get_solid(walls)
#     print(len(solid))
# def solve2():
#     points = {0}
#     pos = 0
#     for line in text.splitlines():
#         _, _, rest = line.split()
#         n, d = int(rest[1:-1][1:][:5], 16), 'RDLU'[int(rest[-2])]
#         dirx = 1j ** 'RDLU'.index(d)
#         pos += dirx * int(n)
#         points.add(pos)
#     b2s = {
#         complex(bx, by) + dx + dy: 3 * complex(sx, sy) + dx + dy
#         for sx, bx in enumerate(sorted({p.real for p in points}))
#         for sy, by in enumerate(sorted({p.imag for p in points}))
#         for dx in [-1, 0, 1] for dy in [-1j, 0, 1j]
#     }
#     s2b = {v: k for k, v in b2s.items()}
#     pos, smallpos = 0, b2s[0]
#     walls = {smallpos}
#     for line in text.splitlines():
#         d, n, rest = line.split()
#         n, d = int(rest[1:-1][1:][:5], 16), 'RDLU'[int(rest[-2])]
#         dirx = 1j ** 'RDLU'.index(d)
#         pos += dirx * int(n)
#         goal = b2s[pos]
#         while smallpos != goal:
#             smallpos += dirx
#             walls.add(smallpos)
#     solid = get_solid(walls)
#     out = 0
#     for smallpos in solid:
#         c1, c2 = s2b[smallpos], s2b[smallpos + 1 + 1j]
#         w, h = (c2 - c1).real, (c2 - c1).imag
#         out += int(w * h)
#     print(out)
# text = open(0).read()
# solve1()
# solve2()
 |