in csharp/src/Containers/SortedSqrtDecomposition.cs [86:125]
private void RebuildSqrt()
{
int index = 0;
needRebuild = false;
for (int i = 0; i < numberOfBlocks; ++i)
{
for (int j = (len * i << 1); j < endOfBlock[i]; ++j)
{
tempArray[index] = data[j];
index++;
}
}
len = (int)Math.Ceiling(Math.Sqrt(index));
if (len < 5)
{
len = 5;
}
numberOfBlocks = (int)Math.Ceiling(1.0 * index / len);
if (numberOfBlocks == 0)
{
numberOfBlocks = 1;
return;
}
if (endOfBlock.Length <= numberOfBlocks)
{
ResizeBlocks(numberOfBlocks << 1);
}
if (data.Length <= (len * (numberOfBlocks + 3) << 1))
{
ResizeData((len * (2 + numberOfBlocks)) << 2);
}
for (int i = 0; i < index; ++i)
{
int tempIndex = i / len;
data[(len * tempIndex << 1) + i % len] = tempArray[i];
endOfBlock[tempIndex] = (len * tempIndex << 1) + i % len + 1;
}
for (int i = 0; i < numberOfBlocks; ++i) dataInBegin[i] = data[len * i << 1];
}