```python
from typing import List

def region_totals(grid: List[List[int]], queries: List[List[int]]) -> List[int]:
    def validate_grid():
        if not grid or not grid[0]:
            raise ValueError("Grid must have at least one row and one cell.")
        
        length = len(grid[0])
        for row in grid:
            if not row or len(row) != length:
                raise ValueError("All rows must be of the same length.")
    
    def validate_query(query: List[int]):
        if len(query) != 4:
            raise ValueError("Each query must be a list of exactly four integers.")
        
        (top, left, bottom, right) = query
        if top >= bottom or left >= right:
            raise ValueError("Top and bottom indices must be strictly less than each other, "
                             "and left and right indices must be strictly less than each other.")
        if top < 0 or left < 0 or bottom > len(grid) or right > len(grid[0]):
            raise ValueError("Query reaches outside the grid bounds.")
    
    validate_grid()
    
    n_rows = len(grid)
    m_cols = len(grid[0])
    prefix_sum_table = [[0] * (m_cols + 1) for _ in range(n_rows + 1)]
    
    # Calculate prefix sum table
    for i in range(1, n_rows + 1):
        for j in range(1, m_cols + 1):
            prefix_sum_table[i][j] = grid[i - 1][j - 1] \
                                   + prefix_sum_table[i - 1][j] \
                                   + prefix_sum_table[i][j - 1] \
                                   - prefix_sum_table[i - 1][j - 1]
    
    def query_totals(query: List[int]) -> int:
        top, left, bottom, right = query
        return (prefix_sum_table[bottom][right] 
                - prefix_sum_table[top][right] 
                - prefix_sum_table[bottom][left] 
                + prefix_sum_table[top][left])
    
    return [query_totals(query) for query in queries]
```