```python
def region_totals(grid: list, queries: list) -> list:
    # Validate grid
    if not isinstance(grid, list) or not grid:
        raise ValueError("grid must be a non-empty list of rows")
    width = len(grid[0]) if isinstance(grid[0], list) else 0
    if width == 0:
        raise ValueError("rows must be non-empty lists")
    for row in grid:
        if not isinstance(row, list) or len(row) != width:
            raise ValueError("rows must all share one length")
        for cell in row:
            if isinstance(cell, bool) or not isinstance(cell, int):
                raise ValueError("cells must be integers")

    # Build prefix-sum table
    n_rows = len(grid)
    n_cols = width
    prefix_sum = [[0] * (n_cols + 1) for _ in range(n_rows + 1)]

    for i in range(1, n_rows + 1):
        for j in range(1, n_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 queries
    for query in queries:
        if not isinstance(query, list) or len(query) != 4:
            raise ValueError("queries must be lists of exactly four integers")
        top, left, bottom, right = query
        if not (0 <= top < n_rows and 0 <= left < n_cols and top < bottom and left < right):
            raise ValueError("queries cannot exceed grid boundaries")

    # Compute block totals
    results = []
    for query in queries:
        top, left, bottom, right = query
        total = prefix_sum[bottom][right] - prefix_sum[top][right] - prefix_sum[bottom][left] + prefix_sum[top][left]
        results.append(total)

    return results
```