Я подозреваю, что вы могли бы сделать это с красно-черным деревом. Над классическим красно-черным деревом каждому узлу потребуются следующие дополнительные поля:
Поле размера будет отслеживать общее количество дочерних узлов, что позволяет вводить и удалять время регистрации (n).
Поле суммы будет отслеживать сумму его дочерних узлов, позволяя суммировать время log (n).
Поле приращения будет использоваться для отслеживания приращения к каждому из его дочерних узлов, которое будет добавлено при расчете сумм. Таким образом, при вычислении итоговой суммы мы возвращаем сумму + размер * приращение. Это самый хитрый. Поле приращения будет добавлено при расчете сумм. Я думаю , добавляя положительные и отрицательные приращения в соответствующих узлах, можно было бы корректно изменить возвращаемую сумму во всех случаях, изменяя только log (n) узлов.
Излишне говорить, что реализация будет очень сложной. Поля суммы и приращения должны будут обновляться после каждой вставки и удаления, и у каждого будет как минимум пять дел для обработки.
Обновление: я не собираюсь пытаться решить это полностью, но я хотел бы отметить, что увеличение i через j на n эквивалентно увеличению целого дерева на n, затем уменьшению от 0 до i на n и уменьшению от j до конец. Глобальное приращение может быть выполнено в постоянное время, при этом две другие операции являются «декрементом левой стороны» и «декрементом правой стороны», которые являются симметричными. Выполнение уменьшения левой стороны до i будет выглядеть примерно так: «возьмите счетчик левого поддерева корневого узла. Если число меньше i, уменьшите поле приращения левого дочернего элемента root на n. Затем примените левое уменьшение n к правому поддереву корневого узла до элементов i - count (left поддерево). В качестве альтернативы, если число больше i, уменьшите поле приращения левого-левого внука корня на n, затем примените левое уменьшение n к лево-правому поддереву корня до счетчика (лево-левое поддерево ) Поскольку дерево сбалансировано, я думаю, что левая операция декремента должна применяться только рекурсивно ln (n) раз. Правильный декрет был бы похожим, но обратным.