protected CNode insertAt (CNode n, Coordinate2D e) {
		assert n != null : "n != null";
		
		//pre-condition: n.hull is well-defined and as a whole
		
		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 {
					CNode nNew = addLeaf(e, n.left, n);
					n = new CNode(nNew, nNew, n);
				}
			}
			else {
				DOWN(n);
				n.left = insertAt(n.left, e);
				UP(n);
			}
		}
		else {
			if (n.isLeaf) {
				CNode nNew = addLeaf(e, n, n.right);
				n = new CNode(n, n, nNew);
			}
			else {
				DOWN(n);
				n.right = insertAt(n.right, e);
				UP(n);
			}
		}
	
		n = fixUp(n);

		//post-condition: n.hull is well-defined and as a whole
		
		return n;
	}