class MultisetFullException extends Exception {

    public MultisetFullException(){
	super("multiset full");
    }
}


class Multiset {

    private int num_elem;
    private int[] elem;
    private int[] mult;

    public Multiset(int maxLength) {
	elem = new int[maxLength];
	mult = new int[maxLength];
	num_elem = 0;
    }

    private int index(int x) {
	int i, found = num_elem;

	for (i = 0; i < num_elem; i++)
	    if (elem[i] == x)
		found = i;
	return(found);
    }

    public boolean mem(int x) {
	return(index(x) < num_elem? true: false);
    }

    public void add(int x) throws MultisetFullException {
	int found;

	if ((found = index(x)) < num_elem)
	    mult[found]++;
	else {
	    if (num_elem == elem.length)
		throw new MultisetFullException();
	    else {
		num_elem++;
		elem[num_elem] = x;
		mult[num_elem] = 1;
	    }
	}
    }

    public boolean delOne(int x) {
	int i, found;

	if ((found = index(x)) < num_elem) {
	    mult[found]--;
	    if (mult[found] == 0) {
	 	for(i = found; i < (num_elem - 1); i++) {
		    elem[i] = elem[i + 1];
		    mult[i] = mult[i + 1];
		}
		num_elem--;
	    }
	    return(true);
	}
	else
	    return(false);
    }

    public boolean delAll(int x) {
	int i, found;

	if ((found = index(x)) < num_elem) {
 	    for(i = found; i < (num_elem - 1); i++) {
	        elem[i] = elem[i + 1];
	        mult[i] = mult[i + 1];
	    }
	    num_elem--;
	    return(true);
	}
	else
	    return(false);
    }

    public int mult(int x) {
	int found;

	if ((found = index(x)) < num_elem)
	    return(this.mult[found]);
	else
	    return(0);
    }

}

