各クエリと各更新を次の場所で実行できる比較的簡単なソリューションがあります O(ログ2n )時間。データ構造はO(ん2) スペース。
私たちは lgん データ構造の「粒度」、2の累乗ごとに1つ 2メートル そのような 1 ≤2メートル≤ n個。細分性のためのデータ構造2メートル 合計を保存する
Σi =k0⋅2メートル(k0+ 1 )⋅2メートル− 1Σj = 0l − 1M[ 私、j ]
それぞれに k0、l。細分性のためのこのデータ構造2メートル 順番に表すことができます n /2メートル バランスの取れたツリー(可能な値ごとに1つ) k0)プレフィックスの合計を保存します。
次に、プレフィックスの合計を調べます k 、l、間隔を分割します [ 0 、k − 1 ]2のべき乗の長さの間隔の和集合に。せいぜいlgん間隔が必要です。そのような長さの間隔ごとに2メートル、粒度のデータ構造を検索します 2メートル。したがって、クエリは次のようにして答えることができますO(ログn ) バランスの取れたツリーへのルックアップ。 O(ログn ) 時間、合計時間 O(ログ2n ) クエリごと。
更新はまたで行うことができます O(ログ2n )時間。更新するにはM[ 私、j ]、粒度ごと 2メートル、粒度のデータ構造で適切なバランスツリーを更新します。 2メートル。これはO(ログn ) oinを更新する O(ログn )バランスの取れた木; そのようなそれぞれのO(logn) 時間なので、合計時間は O(log2n) 時間。
最後に、粒度のデータ構造 2m 含む n/2m 樹木、それぞれ O(n) スペースなので、合計スペース使用量は O(n2⋅(1+1/2+1/4+⋯))=O(n2)。