1) разреженный массив
2,3) куча
В основном вам потребуется реализовать кучу и разреженный массив, которые совместно используют один большой буфер. Обычно значение, хранящееся в разреженном массиве, является указателем. В вашем случае указатель будет относиться к основанию вашей кучи, иначе известный как смещение. Куча должна быть перед разреженным массивом в большом буфере, чтобы изменение размера кучи не изменило смещения.
Обычно что-то вроде этого делается как шаг сглаживания. Другими словами, обычная хеш-таблица или разреженный массив используются с указателями, управляемыми системой, вплоть до точки, в которой все это требуется как один непрерывный блок. В этот момент все упаковывается в какой-то другой формат и снова расширяется позже.