Beispiel #1
0
        private void AddValue(int start, int end, int val, SegmentTreeNode node)
        {
            //if the new interval is completely contains the root of this sub tree
            if (start <= node.Start && node.End <= end)
            {
                node.Booked += val;
                node.Saved  += val;
                return;
            }
            int mid = (node.End + node.Start) / 2;

            if (start <= mid)
            {
                if (node.Left == null)
                {
                    node.Left = new SegmentTreeNode(node.Start, mid, 0, 0);
                }
                AddValue(start, Math.Min(mid, end), val, node.Left);
            }
            if (end >= mid + 1)
            {
                if (node.Right == null)
                {
                    node.Right = new SegmentTreeNode(mid + 1, node.End, 0, 0);
                }
                AddValue(Math.Max(mid + 1, start), end, val, node.Right);
            }
            node.Saved = Math.Max(node.Left?.Saved ?? 0,
                                  node.Right?.Saved ?? 0) + node.Booked;
        }
Beispiel #2
0
 public SegmentTree(int min, int max)
 {
     _root = new SegmentTreeNode(min, max, 0, 0);
 }