protected Node<E> insertAt (Node<E> n, E e) {
		assert n != null : "n != null";
		
		if (e.compareTo(n.lMax.ex) <= 0) {
			if (n.isLeaf) {
				if (e.compareTo(n.ex) == 0) {//corner case, replace old value by the new one
					n.ex = e;
				}
				else {
					Node<E> nNew = addLeaf(e, n.left, n);
					n = new Node<E>(nNew, nNew, n);
				}
			}
			else {
				n.left = insertAt(n.left, e);
			}
		}
		else {
			if (n.isLeaf) {
				Node<E> nNew = addLeaf(e, n, n.right);
				n = new Node<E>(n, n, nNew);
			}
			else {
				n.right = insertAt(n.right, e);
			}
		}
		
		n = fixUp(n);
		
		return n;
	}