2
// Use map's key to store arr's value, map's value to keep <value's location, cummulative arr's4
HashMap<Integer, TreeMap<Integer, Integer>> map;6
public RangeFreqQuery(int[] arr) {9
for (int i = 0; i < arr.length; i++) {10
map.putIfAbsent(arr[i], new TreeMap<>());11
TreeMap<Integer, Integer> tree = map.get(arr[i]);12
// i = value's location13
// tree.size() = cummulative arr's value count - 114
tree.put(i, tree.size());18
public int query(int left, int right, int value) {21
// check if value exist in map22
if (!map.containsKey(value)) {25
TreeMap<Integer, Integer> tree = map.get(value);27
// check if there exist position >= left and position <= right29
if (tree.ceilingKey(left) == null || tree.floorKey(right) == null) {32
// get leftMost position's cummulative count33
int leftMost = tree.get(tree.ceilingKey(left));34
// get rightMost position's cummulative count35
int rightMost = tree.get(tree.floorKey(right));37
return rightMost - leftMost + 1;42
* Your RangeFreqQuery object will be instantiated and called as such: RangeFreqQuery obj = new43
* RangeFreqQuery(arr); int param_1 = obj.query(left,right,value);