private void SegmentTreeUpdate <TQueryObject>(SegmentTreeMode segmentTreeMode, ArrayMode arrayMode, bool randomPoints = false) where TQueryObject : SegmentTreeQueryObject <TQueryObject, int>, new() { int updater(int x) => x + 1; var array = arrayMode == ArrayMode.AllRanges ? _allRangesArray : _randomRangesArray; var segmentTree = segmentTreeMode == SegmentTreeMode.NodeBased ? new NodeBasedSegmentTree <TQueryObject, int>(array) : segmentTreeMode == SegmentTreeMode.ArrayBased ? new ArrayBasedSegmentTree <TQueryObject, int>(array) : (SegmentTree <TQueryObject, int>) new NonRecursiveSegmentTree <TQueryObject, int>(array); if (arrayMode == ArrayMode.AllRanges) { for (int i = 0; i < array.Count; ++i) { for (int j = i; j < array.Count; ++j) { segmentTree.Update(i, j, updater); } } } else { if (randomPoints) { for (int i = 0; i < _randomRangesCount; ++i) { Tuple <int, int> range = _randomRanges[i]; segmentTree.Update(range.Item1, updater); } } else { for (int i = 0; i < _randomRangesCount; ++i) { Tuple <int, int> range = _randomRanges[i]; segmentTree.Update(range.Item1, range.Item2, updater); } } } }
private void SegmentTreeSumRandomOperation(SegmentTreeMode segmentTreeMode) { int updater(int x) => x + 1; var segmentTree = segmentTreeMode == SegmentTreeMode.NodeBased ? new NodeBasedSegmentTree <SumQueryObject, int>(_randomRangesArray) : segmentTreeMode == SegmentTreeMode.ArrayBased ? new ArrayBasedSegmentTree <SumQueryObject, int>(_randomRangesArray) : (SegmentTree <SumQueryObject, int>) new NonRecursiveSegmentTree <SumQueryObject, int>(_randomRangesArray); for (int r = 0; r < _randomRangesCount; ++r) { Tuple <int, int> range = _randomRanges[r]; if (range.Item1 % 2 == 0) { segmentTree.Update(range.Item1, range.Item2, updater); } else { segmentTree.Query(range.Item1, range.Item2); } } }
private void SegmentTreeQuery <TQueryObject>(SegmentTreeMode segmentTreeMode, ArrayMode arrayMode) where TQueryObject : SegmentTreeQueryObject <TQueryObject, int>, new() { var array = arrayMode == ArrayMode.AllRanges ? _allRangesArray : arrayMode == ArrayMode.RightEndingRanges ? _rightEndingRangesArray : _randomRangesArray; var segmentTree = segmentTreeMode == SegmentTreeMode.NodeBased ? new NodeBasedSegmentTree <TQueryObject, int>(array) : segmentTreeMode == SegmentTreeMode.ArrayBased ? new ArrayBasedSegmentTree <TQueryObject, int>(array) : (SegmentTree <TQueryObject, int>) new NonRecursiveSegmentTree <TQueryObject, int>(array); if (arrayMode == ArrayMode.AllRanges) { for (int i = 0; i < array.Count; ++i) { for (int j = i; j < array.Count; ++j) { segmentTree.Query(i, j); } } } else if (arrayMode == ArrayMode.RightEndingRanges) { for (int i = 0; i < array.Count; ++i) { segmentTree.Query(i, array.Count - 1); } } else { for (int i = 0; i < _randomRangesCount; ++i) { Tuple <int, int> range = _randomRanges[i]; segmentTree.Query(range.Item1, range.Item2); } } }