```python
from typing import List

def region_totals(grid: List[List[int]], queries: List[List[int]]) -> List[int]:
    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 a prefix-sum table over the grid
    prefix_sum = [[0] * width for _ in range(len(grid))]
    prefix_sum[0][0] = grid[0][0]
    for i in range(1, width):
        prefix_sum[0][i] = prefix_sum[0][i - 1] + grid[0][i]
    for i in range(1, len(grid)):
        prefix_sum[i][0] = prefix_sum[i - 1][0] + grid[i][0]
    for i in range(1, len(grid)):
        for j in range(1, width):
            prefix_sum[i][j] = prefix_sum[i - 1][j] + prefix_sum[i][j - 1] - prefix_sum[i - 1][j - 1] + grid[i][j]

    # Validate each query and answer it from the table
    result = []
    for query in queries:
        if not isinstance(query, list) or len(query) != 4:
            raise ValueError("queries must be a list of exactly four integers")
        if query[0] >= query[2] or query[1] >= query[3]:
            raise ValueError("query ranges must be valid")
        result.append(prefix_sum[query[2] - 1][query[3] - 1] - prefix_sum[query[0] - 1][query[3] - 1] - prefix_sum[query[2] - 1][query[1] - 1] + prefix_sum[query[0] - 1][query[1] - 1])
    return result
```