interface MyComparable<AnyType> {
    public int compareTo(AnyType o);
}


class Auxiliaries {
public static <AnyType extends MyComparable<AnyType>> 
      AnyType findMax( AnyType [] arr) {
	int maxIndex = 0;

        for (int i = 1; i < arr.length; i++) {
	    if( arr[i].compareTo( arr[ maxIndex ] ) > 0) 
		maxIndex = i;
	}
        return arr[ maxIndex ];
    }
}



class MyFindMaxGen {

 
    public static void main( String [] args) {
	IntHolder [] arr1 = { new IntHolder(11), new IntHolder(21), new IntHolder(17), new IntHolder(34) };
	IntHolder ih = Auxiliaries.findMax ( arr1);
        System.out.println(ih.i);

        Rectangl [] arr2 = {new Rectangl(5, 2), new Rectangl(5, 3), new Rectangl(6, 4), 
                            new Rectangl(6, 2)};
        Rectangl rect =  Auxiliaries.findMax(arr2);
        System.out.println(rect.length + ", " + rect.breadth);
    }
}

class IntHolder implements MyComparable<IntHolder> {
    int i;
    public IntHolder (int i1) {
	i = i1;
    }
    public int compareTo(IntHolder o) {
        if (i > o.i) return 1;
        if (i == o.i) return 0;
        if (i < o.i) return -1;
        return 0;
    }
}

class Rectangl implements MyComparable<Rectangl> {
    int length, breadth;
    public Rectangl (int l, int b) {
	length = l; 
        breadth = b;
    }
    public int compareTo(Rectangl o) {
        if ( length * breadth > o.length * o.breadth ) return 1;
        if ( length * breadth == o.length * o.breadth ) return 0;
        if ( length * breadth < o.length * o.breadth ) return -1;
        return 0;
    }
}