Segment Tree

    SegmentTreeNode root;
    int[] nums;
    public NumArray(int[] nums) {
        this.nums = nums;
        root = buildSegmentTree(nums, 0, nums.length - 1);
    }

    private SegmentTreeNode buildSegmentTree(int[] nums, int s, int e) {
        if (e < s) return null;
        if (s == e) return new SegmentTreeNode(s, e, nums[s]);
        SegmentTreeNode curt = new SegmentTreeNode(s, e);
        curt.left = buildSegmentTree(nums, s, curt.mid);
        curt.right = buildSegmentTree(nums, curt.mid + 1, e);
        curt.sum = curt.left.sum + curt.right.sum;
        return curt;
    }

    public void update(int i, int val) {
        nums[i] = val;
        updateHelper(i, val, root);
    }

    private void updateHelper(int i, int val, SegmentTreeNode curt) {
        if (curt.start == curt.end && curt.start == i) {
            curt.sum = val;
            return;
        }
        if (i > curt.mid) {
            updateHelper(i, val, curt.right);
        } else {
            updateHelper(i, val, curt.left);
        }
        curt.sum = curt.left.sum + curt.right.sum;
    }

    public int sumRange(int i, int j) {
        return sumHelper(i, j, root);
    }

    private int sumHelper(int i, int j, SegmentTreeNode curt) {
        if (curt.start == i && curt.end == j) return curt.sum;
        if (j <= curt.mid) {
            return sumHelper(i, j, curt.left);
        } else if (i > curt.mid) {
            return sumHelper(i, j, curt.right);
        } else {
            return sumHelper(i, curt.mid, curt.left) + sumHelper(curt.mid + 1, j, curt.right);
        }
    }

    class SegmentTreeNode {
        int start, end, mid;
        int sum;
        SegmentTreeNode left, right;

        SegmentTreeNode(int start, int end) {
            this.start = start;
            this.end = end;
            this.mid = start + (end - start) / 2;
        }
        SegmentTreeNode(int start, int end, int sum) {
            this.start = start;
            this.end = end;
            this.mid = start + (end - start) / 2;
            this.sum = sum;
        }
    }

Good Subarray

An array is good if all subarrays have atleast 1 element in them whose frequency is 1.

For Example :

Since all subarrays [1], [1,2], [2,1], [1,2,1] have at least 1 element that occurs once. Expected Time Complexity : O(NlogN)

Last updated

Was this helpful?