allocate mem(2^30)

W = 100

T = matrix(2*W+1, 2*W+1, x,y, -1)

get(z) = my (x=real(z), y=imag(z)); if (min(x,y)>0 && max(x,y)<=#T, T[x,y], -1)
set(z,v) = my (x=real(z), y=imag(z)); T[x,y] = v

U = vector(4, k, I^(k-1))
K = concat(U*(2+I), U*(2-I))

compute(z) = {
	my (x=0);
	for (k=1, #K,
		my (v = get(z+K[k]));
		if (v>=0,
			x = bitor(x, 2^v);
		);
	);
	valuation(1+x,2);
}

{
	z=(W+1)*(1+I);
	n=0;
	k=0;
	dir=1;
	for (w=1, oo,
		for (t=1, 2,
			for (i=1, w,
				n++;

				v = compute(z);
				set(z, v);

				if (v==4,
					print (k++ " " n-1);
				);

				if (n==(2*W+1)^2,
					break (3);
				);

				z+=dir;
			);
			dir*=I;
		);
	);
}

quit