1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| class SegmentTree { SegmentTreeNode root;
SegmentTree(int start, int end) { root = new SegmentTreeNode(start, end); }
private void pushdown(SegmentTreeNode root) { if (root.left == null) { root.left = new SegmentTreeNode(root.start, root.mid); } if (root.right == null) { root.right = new SegmentTreeNode(root.mid + 1, root.end); } if (root.lazyadd != 0) { root.left.maxval += root.lazyadd; root.left.minval += root.lazyadd; root.right.maxval += root.lazyadd; root.right.minval += root.lazyadd; root.left.lazyadd += root.lazyadd; root.right.lazyadd += root.lazyadd; root.lazyadd = 0; } }
private void pushup(SegmentTreeNode root) { root.maxval = Math.max(root.left.maxval, root.right.maxval); root.minval = Math.min(root.left.minval, root.right.minval); }
private void modify(SegmentTreeNode root, int start, int end, int addval) { if (root.start >= start && root.end <= end) { root.maxval += addval; root.minval += addval; root.lazyadd += addval; return; } pushdown(root); if (root.mid >= start) { modify(root.left, start, end, addval); } if (root.mid < end) { modify(root.right, start, end, addval); } pushup(root); }
private int[] findMaxNMin(SegmentTreeNode root, int start, int end) { if (root.start >= start && root.end <= end) { return new int[] { root.maxval, root.minval }; } pushdown(root); int maxval = -1, minval = (int) 1e9; if (root.mid >= start) { int[] larr = findMaxNMin(root.left, start, end); maxval = Math.max(maxval, larr[0]); minval = Math.min(minval, larr[1]); } if (root.mid < end) { int[] rarr = findMaxNMin(root.right, start, end); maxval = Math.max(maxval, rarr[0]); minval = Math.min(minval, rarr[1]); }
return new int[] { maxval, minval }; }
public void modify(int start, int end, int addval) { modify(root, start, end, addval); }
public int[] findMaxNMin(int start, int end) { return findMaxNMin(root, start, end); }
}
|