program Fill;

const
	MAXD				= 200;
	not_possible			= 30000;	

type
	Integer				= LongInt;

var
	f				: Array [0 .. MAXD] of Integer;
	w				: Array [1 .. MAXD, 1 .. 3] of Integer;
	a, b, c				: Integer;
	d				: Integer;

procedure Init;
var
	i				: Integer;
begin
	for i := 1 to MAXD do
		f[i] := not_possible;
end;

procedure readInput;
begin
	readln(a, b, c, d);
end;

function possible

procedure Solve;
var
        i, j, k                         : Integer;
	tmp, tw				: Integer;
begin
	f[0] := 0; w[0] := 0;
	if (c > a) then begin
		f[a] := a; w[a, 1] := a; w[a, 2] := 0;
		w[a, 3] := c - a;
		f[c - a] := a; w[c - a] := 3;
	end;
	if (c > b) then begin
		if (f[b] > b) then begin
			f[b] := b; 
			w[b, 1] := 0;
			w[b, 2] := b;
			w[b, 3] := c - b;
		end;
		if (f[c - b] > b) then begin
			f[c - b] := b; w[c - b, 1] := 0;
			w
		end;
	end;
	f[c] := 0;
	for i := 1 to c do begin
		if (f[i] = not_possible) then begin
			j := 1;
			k := i - 1;
			tmp := not_possible;
			while (j < k) do begin
				if ((f[j] + f[k] + possible(j, k) < tmp) then begin
					tmp := f[j] + f[k];
					tw := smartAss(j, k);
				end;
				j := j + 1;
				k := k - 1;
			end;
			if (j = k) then
				if (3 * f[j] < tmp) then
					tmp := 3 * f[j];
			f[i] := tmp;
			w[i] := tw;
		end;
	end;
	if (f[d] = not_possible) then begin
		i := d - 1;
		while (f[i] = not_possible) do
			i := i - 1;
		writeln(f[i], ' ', i);
	end else 
		writeln(f[d], ' ', d);
end;

begin
	Init;
	readInput;
	if (c = d) then
		writeln('0 ', d)
	else
		Solve;
end.
	
