Untitled
sakshamjain08
plain_text
a year ago
1.6 kB
5
Indexable
// Segment Tree Max in an interval query. public class Main { public static void main(String[] args) { int []arr = {8,7,4,2,5,3,1,10}; SegmentTree s = new SegmentTree(arr); System.out.println(s.query(0,7)); System.out.println(s.query(0,3)); System.out.println(s.query(2,5)); System.out.println(s.query(1,6)); } } class SegmentTree{ int []tree; int []arr; public SegmentTree(int []arr){ this.arr = arr; this.tree = new int[4*arr.length]; build(0,0,arr.length-1); } public void build(int idx, int l, int h){ if(l == h){ this.tree[idx] = this.arr[l]; return; } int mid = l + (h-l)/2; build(2*idx + 1, l,mid); build(2*idx + 2, mid+1,h); this.tree[idx] = Math.max(this.tree[2*idx+1], this.tree[2*idx+2]); } public int query(int l, int r){ return query(0,0,arr.length-1, l, r); } private int query(int idx, int start, int end, int l, int r){ // contains if(l <= start && end <= r){ return this.tree[idx]; } // non overlapping if(end < l || r < start){ return Integer.MIN_VALUE; } // overlapping int mid = start + (end - start)/2; int left = query(2*idx+1, start, mid, l,r); int right = query(2*idx+2, mid+1, end, l, r); return Math.max(left,right); } }
Editor is loading...
Leave a Comment