```python
from typing import List, Dict, Tuple

def meter_draws(draws: List[Tuple[str, int]], allowance: int) -> Dict[str, int]:
    if allowance <= 0:
        raise ValueError("Allowance must be a positive integer")
    
    used = {}
    refused_positions = []
    for key, units in draws:
        if not isinstance(key, str) or not key.isalnum():
            raise ValueError("Key must be a non-empty string")
        if units <= 0:
            raise ValueError("Units must be a positive integer")
        
        if key in used:
            if units > allowance - used[key]:
                refused_positions.append((key, len(draws) - 1))
                continue
            used[key] += units
        else:
            if units > allowance:
                refused_positions.append((key, len(draws) - 1))
                continue
            used[key] = units
    
    return {"used": used, "denied": refused_positions}

def remaining_for(used: Dict[str, int], key: str, allowance: int) -> int:
    if not isinstance(key, str) or not key.isalnum():
        raise ValueError("Key must be a non-empty string")
    if allowance <= 0:
        raise ValueError("Allowance must be a positive integer")
    
    if key in used:
        return allowance - used[key]
    else:
        return allowance
```