you could make an array based structure (AoA) where first element is the start number of a range and 2nd element is size or end of that range
That's not very inefficient as it would use a lot of memory unnecessarily. It's better to just use a pair of arrays (@start, @end):
DB<2> use Devel::Size 'total_size'
DB<3> total_size([map [rand, rand], 1..1000])
DB<4> use Devel::Size 'total_size'
DB<5> x total_size([map [rand, rand], 1..1000])
0 224176
DB<6> x total_size([[map rand, 1..1000], [map rand, 1..1000]])
0 80464