import os
import argparse
CHUNK_SIZE = 4096

def tail(path, n):
    """Return the last n lines of a file without loading it fully into memory."""
    with open(path, "rb") as f:
        f.seek(0, os.SEEK_END)
        file_size = remaining = f.tell()
        buffer = b""
        newline_count = 0

        while remaining > 0 and newline_count <= n:
            read_size = min(CHUNK_SIZE, remaining)
            remaining -= read_size
            f.seek(remaining)
            chunk = f.read(read_size)
            buffer = chunk + buffer
            newline_count = buffer.count(b"\n")

        lines = buffer.splitlines()
        last_lines = lines[-n:] if n <= len(lines) else lines
        return [line.decode("utf-8", errors="replace") for line in last_lines]

def main():
    parser = argparse.ArgumentParser(description="tail reimplementation")
    parser.add_argument("-n", type=int, default=10, help="number of lines")
    parser.add_argument("files", nargs="+")
    args = parser.parse_args()
    for i, path in enumerate(args.files):
        for line in tail(path, args.n):
            print(line)


if __name__ == "__main__":
    main()