```python
from typing import List

def region_totals(grid: List[List[int]], queries: List[List[int]]) -> List[int]:
    rows = len(grid)
    cols = len(grid[0])

    # Validate grid
    if not grid or not all(len(row) == cols for row in grid):
        raise ValueError("Invalid grid dimensions")
    if not all(isinstance(cell, int) for row in grid for cell in row):
        raise ValueError("Grid contains non-integer values")

    # Build prefix-sum table
    prefix_sum = [[0] * (cols + 1) for _ in range(rows + 1)]
    for i in range(1, rows + 1):
        for j in range(1, cols + 1):
            prefix_sum[i][j] = grid[i-1][j-1] + prefix_sum[i-1][j] + prefix_sum[i][j-1] - prefix_sum[i-1][j-1]

    # Validate and answer queries
    results = []
    for query in queries:
        if len(query) != 4:
            raise ValueError("Query must have exactly four integers")
        top, left, bottom, right = query
        if not (0 <= top < rows and 0 <= left < cols and 0 <= bottom <= rows and 0 <= right <= cols and top < bottom and left < right):
            raise ValueError("Invalid query bounds")
        block_sum = prefix_sum[bottom][right] - prefix_sum[top][right] - prefix_sum[bottom][left] + prefix_sum[top][left]
        results.append(block_sum)

    return results
```