Готовы ли вы обменять пространство на скорость? В таком случае вы можете статически выделить всю структуру 16x16.
struct Image {
struct Range ranges[16*16];
};
каждая строка ([0..15], [16..31] ...) будет содержать не более 16 различных диапазонов (при условии, что у вас нет только двоичных данных, в таком случае 8 будет), последний диапазон будет обозначаться каким-либо часовым значением, например, «-1», «0» или чем-то еще.
В зависимости от операции, может быть предпочтительнее задать диапазон структуры, например:
struct Range {
int startpos;
int count; /* or int endpos - depending on your preference */
};
Слияние путем создания нового изображения легко - вы проходите каждую строку в обоих «входных» изображениях одновременно с левой стороны и выводите ту, у которой меньше «startpos», в случае объединения соседних областей вы обновляете последнюю записанную область ,
Объединение на месте не так уж сложно, с некоторым буфером это можно сделать и за один прогон.