```python
from typing import List

def region_totals(grid: List[List[int]], queries: List[List[int]]) -> List[int]:
    """
    Calculate the sum of each specified block in a grid.

    :param grid: A non-empty list of rows, each row containing integers.
    :param queries: A list of queries, each defined by four integers [top, left, bottom, right].
    :return: A list of sums for each query.
    """
    if not grid:
        raise ValueError("Grid cannot be empty.")
    if len(grid) == 0 or not grid[0]:
        raise ValueError("First row must contain at least one cell.")
    first_length = len(grid[0])
    for row in grid:
        if len(row) != first_length:
            raise ValueError("All rows must have the same number of cells.")

    def prefix_sum_table():
        ps_table = [[0] * (first_length + 1) for _ in range(len(grid) + 1)]
        for i in range(1, len(grid) + 1):
            for j in range(1, first_length + 1):
                ps_table[i][j] = grid[i - 1][j - 1] + ps_table[i - 1][j] + ps_table[i][j - 1] - ps_table[i - 1][j - 1]
        return ps_table

    def region_sum(top: int, left: int, bottom: int, right: int) -> int:
        if top >= bottom or left >= right:
            raise ValueError("Invalid query bounds.")
        return (
            ps_table[bottom][right] -
            ps_table[top][right] -
            ps_table[bottom][left] +
            ps_table[top][left]
        )

    ps_table = prefix_sum_table()
    totals = [region_sum(query[0], query[1], query[2], query[3]) for query in queries]
    return totals
```