with recursive raw (line) as ( select * from read_csv('data/05.in', header = false) ), ranges (low, high) as ( select cast(spl[1] as int64), cast(spl[2] as int64) from ( select split(line, '-') as spl from raw where contains(line, '-') ) ), ingredients (id) as ( select cast(line as int64) from raw where line <> '' and not contains(line, '-') ), part1 (solution) as ( select count(*) from ingredients where exists ( select low, high from ranges where id between low and high ) ), merged (low, high) as ( select * from ranges union select r1.low, case when r1.high < r2.high then r2.high else r1.high end from merged r1, merged r2 where (r1.low < r2.low or (r1.low = r2.low and r1.high < r2.high)) and not r1.high < r2.low and not r2.high < r1.low ), part2 (solution) as ( select sum(m1.high - m1.low + 1) from merged m1 where not exists ( select * from merged m2 where (m1.high <> m2.high or m1.low <> m2.low) and m1.high <= m2.high and m1.low >= m2.low ) ) select part1.solution, part2.solution from part1, part2