#!/usr/bin/perl -w

use v5.30;
use strict;

my $serial = shift @ARGV;

my %cache;
sub power_at {
	my ($x, $y) = @_;
	return $cache{$x,$y} if defined $cache{$x,$y};

	my $rack_id = $x + 10;
	my $power = ($rack_id * $y + $serial) * $rack_id;
	$power = "000" . $power;
	$power =~ s/.*(.)..\z/$1/;
	$power -= 5;
	return $cache{$x,$y} = $power;
}

my %sq_cache;
my ($maxx, $maxy, $maxsize, $maxpwr);
sub square_at {
	my ($x, $y, $sizex, $sizey) = @_;

	return $sq_cache{$x,$y,$sizex,$sizey}
		if defined $sq_cache{$x,$y,$sizex,$sizey};

	my $sum;
	if ($sizex == 1 && $sizey == 1) {
		$sum = power_at($x, $y);
	} elsif ($sizex == 1) {
		$sum = square_at($x, $y, $sizex, $sizey-1)
			+ power_at($x, $y+$sizey-1);
	} elsif ($sizey == 1) {
		$sum = square_at($x, $y, $sizex-1, $sizey)
			+ power_at($x+$sizex-1, $y);
	} else {
		$sum = square_at($x, $y, $sizex-1, $sizey-1)
			+ square_at($x+$sizex-1, $y, 1, $sizey-1)
			+ square_at($x, $y+$sizey-1, $sizex-1, 1)
			+ power_at($x+$sizex-1, $y+$sizey-1);
	}
	if ($sizex == $sizey && (!defined $maxpwr || $sum > $maxpwr)) {
		$maxpwr = $sum;
		$maxx = $x;
		$maxy = $y;
		$maxsize = $sizex;
	}
	$sq_cache{$x,$y,$sizex,$sizey} = $sum;
}

for my $size (1 .. 300) {
	for my $x (1 .. 301-$size) {
		for my $y (1 .. 301-$size) {
			my $sz = square_at($x, $y, $size, $size);
			# say "$x,$y,$size = $sz";
		}
	}
	say "size $size, $maxx,$maxy,$maxsize = $maxpwr";
}

say "$maxx,$maxy,$maxsize = $maxpwr";
			
		
	
	

