// Method-1
class NumberContainers {

    HashMap<Integer, Integer> idx_num;
    HashMap<Integer, PriorityQueue<Integer>> num_indices;

    public NumberContainers() 
    {
        idx_num = new HashMap<Integer, Integer>();
        num_indices = new HashMap<>();        
    }
    
    public void change(int index, int number) 
    {
        if(idx_num.containsKey(index))
        {
            int old_value = idx_num.get(index);
            if(old_value == number) return;

            num_indices.get(old_value).remove(index);
        }

        idx_num.put(index, number);
        num_indices.computeIfAbsent(number, k -> new PriorityQueue<>()).add(index);        
    }
    
    public int find(int number) 
    {
        if(!num_indices.containsKey(number)) return -1;

        return num_indices.get(number).peek() == null ? -1 : num_indices.get(number).peek(); 
    }
}



// Method-2 
class NumberContainers {

    HashMap<Integer, Integer> idx_num;
    HashMap<Integer, TreeSet<Integer>> num_indices;

    public NumberContainers() 
    {
        idx_num = new HashMap<Integer, Integer>();
        num_indices = new HashMap<>();        
    }
    
    public void change(int index, int number) 
    {
        if(idx_num.containsKey(index))
        {
            int old_value = idx_num.get(index);
            num_indices.get(old_value).remove(index);

            if(num_indices.get(old_value).isEmpty())
            {
                num_indices.remove(old_value);
            }
        }

        idx_num.put(index, number);
        num_indices.computeIfAbsent(number, k -> new TreeSet<>()).add(index);        
    }
    
    public int find(int number) 
    {
        if(!num_indices.containsKey(number)) return -1;

        return num_indices.get(number).first(); 
    }
}




// Method-3
class NumberContainers {

    HashMap<Integer, Integer> idx_num;
    HashMap<Integer, PriorityQueue<Integer>> num_indices;

    public NumberContainers() 
    {
        idx_num = new HashMap<Integer, Integer>();
        num_indices = new HashMap<>();        
    }
    
    public void change(int index, int number) 
    {
        if(idx_num.containsKey(index))
        {
            int old_value = idx_num.get(index);
            if(old_value == number) return;

            num_indices.get(old_value).remove(index);
        }

        idx_num.put(index, number);
        num_indices.computeIfAbsent(number, k -> new PriorityQueue<>()).add(index);        
    }
    
    public int find(int number) 
    {
        PriorityQueue<Integer> res = num_indices.getOrDefault(number, new PriorityQueue<>());

        return res.isEmpty() ? -1 : res.peek();  
    }
}





// Method-4
class NumberContainers {

    HashMap<Integer, Integer> idx_num;
    HashMap<Integer, PriorityQueue<Integer>> num_indices;

    public NumberContainers() 
    {
        idx_num = new HashMap<Integer, Integer>();
        num_indices = new HashMap<>();        
    }
    
    public void change(int index, int number) 
    {
        if(idx_num.containsKey(index))
        {
            int old_value = idx_num.get(index);
            if(old_value == number) return;

            num_indices.get(old_value).remove(index);
        }

        idx_num.put(index, number);
        num_indices.computeIfAbsent(number, k -> new PriorityQueue<>()).add(index);        
    }
    
    public int find(int number) 
    {
        if(!num_indices.containsKey(number)) return -1;

        return num_indices.get(number).peek() == null ? -1 : num_indices.get(number).peek(); 
    }
}





// Method-5
class NumberContainers {

    HashMap<Integer, Integer> idx_num;
    HashMap<Integer, TreeSet<Integer>> num_indices;

    public NumberContainers() 
    {
        idx_num = new HashMap<Integer, Integer>();
        num_indices = new HashMap<>();        
    }
    
    public void change(int index, int number) 
    {
        if(idx_num.containsKey(index))
        {
            int old_value = idx_num.get(index);
            
            if(old_value == number) return;

            num_indices.get(old_value).remove(index);

            if(num_indices.get(old_value).isEmpty())
            {
                num_indices.remove(old_value);
            }

        }

        idx_num.put(index, number);
        num_indices.computeIfAbsent(number, k -> new TreeSet<>()).add(index);        
    }
    
    public int find(int number) 
    {
        if(!num_indices.containsKey(number)) return -1;

        return num_indices.get(number).first(); 
    }
}





// Method-6 (Time Limit exceeded)
class NumberContainers {

    HashMap<Integer, Integer> idx_num;
    HashMap<Integer, PriorityQueue<Integer>> num_indices;

    public NumberContainers() 
    {
        idx_num = new HashMap<Integer, Integer>();
        num_indices = new HashMap<>();        
    }
    
    public void change(int index, int number) 
    {
        if(idx_num.containsKey(index))
        {
            int old_value = idx_num.get(index);
            num_indices.get(old_value).remove(index);

            if(num_indices.get(old_value).isEmpty())
            {
                num_indices.remove(old_value);
            }
        }

        idx_num.put(index, number);
        num_indices.computeIfAbsent(number, k -> new PriorityQueue<>()).add(index);        
    }
    
    public int find(int number) 
    {
        if(!num_indices.containsKey(number)) return -1;

        return num_indices.get(number).peek(); 
    }
}