```python
def region_totals(grid: list, queries: list) -> list:
    if not grid or not all(isinstance(row, list) for row in grid):
        raise ValueError("Grid must be a non-empty list of rows")
    row_len = len(grid[0])
    if not all(len(row) == row_len for row in grid) or not all(isinstance(cell, int) for row in grid for cell in row):
        raise ValueError("All rows must have the same length and contain only integers")
    
    prefix_sum = [[0] * (row_len + 1) for _ in range(len(grid) + 1)]
    for i in range(1, len(grid) + 1):
        for j in range(1, row_len + 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]
    
    results = []
    for query in queries:
        if not isinstance(query, list) or len(query) != 4:
            raise ValueError("Each query must be a list of exactly four integers")
        top, left, bottom, right = query
        if not (0 <= top < bottom <= len(grid)) or not (0 <= left < right <= row_len):
            raise ValueError("Query indices are out of 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
```