import java.util.*;

public class MultiMap<K,V> {
 
    protected Map<K, Set<V>> m ;

    public MultiMap() {
	     m = new HashMap<K,Set<V>>(); 
    }

    public boolean containsKey(Object key){
       return m.containsKey(key);
    }

    public int size() {
	     return m.size();
    }

    public void put(K key, V value) {
        Set<V> ens = m.get(key);
        if (ens == null) {
	      ens = new HashSet<V>();
            m.put(key,ens);
	      }
	      ens.add(value);
    }
  
    public Set<V> get(Object key) {
	     return m.get(key);
    }

    public Set<V> removeKey(Object key) { 
	     return m.remove(key);
    }
    
    public void removeValue(Object value) {
	      Set<V> ens;
        for (K key : m.keySet()) {
            ens = m.get(key);
            for (Iterator<V> it = ens.iterator(); it.hasNext(); ) {
	          if (it.next().equals(key)) it.remove();
            }
            if (ens.size() == 0) removeKey(key);
        }
    }

    public Set<K> keySet() {
	     return m.keySet();
    }
}
