Убираем создание списка result_lens, чтобы не сохранять промежуточные результаты.
Вместо этого вычисляем площадь каждой пары на лету и сразу же обновляем значение максимальной площади в переменной max_area.
Убираем ненужное копирование списка data_copy.
Для понимания изначально сложность алгоритма по памяти составляла O(n^2), но поскольку мы оптимизировали алгоритм, убрав сохранение промежуточных данных в список и используя одну лишь переменную для хранения максимальной площади, сейчас сложность составляет O(1)
length = input().split()
data = [int(x) for x in length]
n = len(data)
max_area = 0
for i in range(n):
for j in range(i + 1, n):
pair_width = abs(i - j)
pair_height = min(data[i], data[j])
max_area = max(max_area, pair_height * pair_width)
print(max_area)