```python
from typing import List

def region_totals(grid: List[List[int]], queries: List[List[int]]) -> List[int]:
    if not grid or not all(grid) or not all(len(row) == len(grid[0]) for row in grid):
        raise ValueError("Invalid grid dimensions")
    
    rows, cols = len(grid), len(grid[0])
    
    # Validate queries
    for query in queries:
        if len(query) != 4 or any(not isinstance(q, int) for q in query):
            raise ValueError("Invalid query format")
        top, left, bottom, right = query
        if top < 0 or left < 0 or bottom > rows or right > cols or top >= bottom or left >= right:
            raise ValueError("Query out of bounds or invalid indices")
    
    # Compute 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]
    
    # Compute totals
    result = []
    for top, left, bottom, right in queries:
        total = prefix_sum[bottom][right] - prefix_sum[bottom][left] - prefix_sum[top][right] + prefix_sum[top][left]
        result.append(total)
    
    return result
```