function mex (id, pr, n, a):
    infinity := 9999999
    log_parts := 4
    parts := 1 << log_parts
    values := pr / parts
    span := n / values + 2
    if id < parts * values:
        id_part := id % parts
        id_value := id / parts

        lo := id_part * n / parts
        hi := (id_part + 1) * n / parts

        lo_value := id_value * (n + 1) / values
        hi_value := (id_value + 1) * (n + 1) / values

        print (id, lo, hi, lo_value, hi_value)

        mark := array (span)

        for i := lo until hi:
            if (lo_value <= a[i]) & (a[i] < hi_value):
            	mark[a[i] - lo_value] := 1

        for deg2 := 0 until log_parts:
            if (id & (1 << deg2)) > 0:
                to := id - (1 << deg2)
                for v := 0 until span:
                    send (to, mark[v])
            else:
                from := id + (1 << deg2)
                print (id, from)
                for v := 0 until span:
                    mark[v] |= receive (from)

        if id % parts == 0:
            lo_value := id_value * (n + 1) / values
            hi_value := (id_value + 1) * (n + 1) / values
            ok := 1
            res := infinity
            for k := lo_value until hi_value:
                if ok & (mark[k - lo_value] == 0):
                    res := k
                    ok := 0
            send (pr - 1, res)

    if id == pr - 1:
        res := infinity
        for from := 0 until parts * values:
            if (from % parts == 0):
                temp := receive (from)
                if res > temp:
                    res := temp
        print (res)
