Problem p02971 (python)

Fixed submission:
n = int(input())
nums = [int(input()) for i in range(n)]
n_max = max(nums)
ex_nums = [i for i in nums]
ex_nums.remove(n_max)
n_semi_max = max(ex_nums)
for i in nums:
    if i == n_max:
        print(n_semi_max)
    else:
        print(n_max)

Buggy submission (verdict: Runtime Error):
"""長さNの整数A1,A2,...,ANが与えられる。1以上N以下の各整数iに対し、数列中のAiを除くN-1個の要素のうち、最大の値を求める

    N (int): 数列の個数
        Nは整数
        2≦N≦200000
    Ai...N list(int): 数列中の各整数
        整数
        1≦Ai≦200000

考え方として、最大の数値のインデックスが指定された場合は2番目に大きな値を、
それ以外は最大の数値を出力するようにすることで、数列全体を調査するコストを最小に減らすことができる。

Raises:
    ValueError: 数列の個数に制約外の値が指定された場合
"""

from typing import List, Any, Iterable


SEQUENCE_LEN_MIN = 2
SEQUENCE_LEN_MAX = 200000
NUMERIC_MIN = 1
NUMERIC_MAX = 200000


class NumericInfo:
    """数列中の値とその値のインデックスを管理する"""
    def __init__(self):
        # 初期状態は言語仕様・制約上入力されない値を指定する
        self.index = - 1
        self.value = NUMERIC_MIN - 1

    def update(self, idx: int, val: int):
        self.index = idx
        self.value = val

    def copy(self, info: Any):
        self.update(info.index, info.value)


class SequenceProcessor:
    def __init__(self, sequence: List[int]):
        self.sequence_length = len(sequence)
        self.first_largest_num_info = NumericInfo()
        self.second_largest_num_info = NumericInfo()
        self._process(sequence)

    def _process(self, sequence: List[int]):
        """引数で渡される数列をもとに、後の処理で使うインスタンス変数を初期化する
            sequence_length (int): 配列の個数
            first_largest_num_info (NumericInfo): 最大値のインデックスと値
            second_largest_num_info (NumericInfo): 2番目に大きな値のインデックスと値

        Args:
            sequence (List[int]): 数列
        """
        for i, num in enumerate(sequence):
            if self.first_largest_num_info.value < num:
                self.second_largest_num_info.copy(self.first_largest_num_info)
                self.first_largest_num_info.update(i, num)
            elif self.second_largest_num_info.value < num:
                self.second_largest_num_info.update(i, num)

    def _max_value(self, idx: int) -> int:
        """指定されたインデックスの値を除く、数列中の最大値を求める

        Args:
            idx (int): 指定されたインデックス
        """
        if idx == self.first_largest_num_info.index:
            return self.second_largest_num_info.value
        else:
            return self.first_largest_num_info.value

    def all_max_value(self) -> Iterable[int]:
        """数列全てのインデックスに対して、インデックスの値を除く、数列中の最大値を求める
        """
        for i in range(self.sequence_length):
            yield self._max_value(i)


def _validate_sequence_length(s: str):
    """入力値（数列の個数）が制約通りか検証する

    Args:
        s (str): 数列の個数が制約通りか検証する文字列
            制約1. 整数であること
            制約2. 2以上200000以下であること
    Raises:
        ValueError: 制約外の値が渡された場合
   """
    if not s.isdigit():
        raise ValueError("数列の個数の入力値が整数ではありません")
    r = int(s)
    if not SEQUENCE_LEN_MIN <= r <= SEQUENCE_LEN_MAX:
        raise ValueError(
            f"数列の個数は{SEQUENCE_LEN_MIN}から"
            f"{SEQUENCE_LEN_MAX}の間で指定してください")


def get_sequence_length_from_stdin() -> int:
    """数列の個数を標準入力から取得する

    Returns:
        int: 数列の個数
    """
    s = input()
    s = s.strip()
    _validate_sequence_length(s)
    return int(s)


def _validate_numeric(s):
    """入力値（数値）が制約通りか検証する

    Args:
        s (str): 数値が制約通りか検証する文字列
            制約1. 整数であること
            制約2. 1以上200000以下であること
    Raises:
        ValueError: 制約外の値が渡された場合
   """
    if not s.isdigit():
        raise ValueError("数値の入力値が整数ではありません")
    r = int(s)
    if not NUMERIC_MIN <= r <= NUMERIC_MAX:
        raise ValueError(
            f"数値は{NUMERIC_MIN}から{NUMERIC_MAX}の間で指定してください")


def get_sequence_from_stdin(length: int) -> List[int]:
    """標準入力から数列を作成する

    Args:
        length (int): 作成する数列の個数

    Returns:
        List[int]: 数列
   """
    result = []
    for i in range(1, length+1):
        while True:
            n = input()
            try:
                _validate_numeric(n)
                result.append(int(n))
                break
            except ValueError:
                print("入力値に誤りがあります。再入力してください。")
                continue
    return result


def main():
    seq_len = get_sequence_length_from_stdin()
    sequence = get_sequence_from_stdin(seq_len)
    seq_processor = SequenceProcessor(sequence)
    for num in seq_processor.all_max_value():
        print(num)


if __name__ == '__main__':
    main()

Buggy submission (verdict: Runtime Error):
n = int(input())
nums = [int(input()) for i in range(n)]
n_max = max(nums)
ex_nums = [i for i in nums].remove(n_max)
n_semi_max = max(ex_nums)
for i in nums:
    if i == n_max:
        print(n_semi_max)
    else:
        print(n_max)