class Bag {
    int[] a /*@ non_null */;
    int n;

    /*@ invariant 0 <= n  && n <= a.length; */

    Bag(int[] input /*@ non_null */ ) {
        n = input.length;
        a = new int[n];
        System.arraycopy(input, 0, a, 0, n);
    }

    //@ requires n >= 1;
    //@ modifies n, a[*];
    //@ ensures n == \old(n) - 1;
    //@ ensures (\forall int i; 0 <= i && i < \old(n) ==> \old(a[i]) >= \result);
    //@ ensures (\exists int i; 0 <= i && i < \old(n) ==> \old(a[i]) == \result);
    int extractMin() {
        int m = a[0];
        int mindex = 0;

        int i = 1;
        //@ loop_invariant (\forall int k; 0 <= k && k < i ==> a[k] >= m);
        //@ loop_invariant (\exists int k; 0 <= k && k < i ==> a[k] == m);
        while (i < n) {
            if (a[i] < m) {
                mindex = i;
                m = a[i];
            }
            i = i+1;
        }
        n--;
        a[mindex] = a[n];
        return m;
    }
}
