```python
def meter_draws(draws: list, allowance: int) -> dict:
    if not isinstance(allowance, int) or allowance <= 0:
        raise ValueError("Allowance must be a positive integer")
    
    used = {}
    denied = []
    
    for i, (key, units) in enumerate(draws):
        if not isinstance(key, str) or not key:
            raise ValueError("Key must be a non-empty string")
        if not isinstance(units, int) or units <= 0:
            raise ValueError("Units must be a positive integer")
        
        remaining = remaining_for(used, key, allowance)
        if remaining >= units:
            used[key] = used.get(key, 0) + units
        else:
            denied.append(i)
    
    return {"used": used, "denied": denied}

def remaining_for(used: dict, key: str, allowance: int) -> int:
    return allowance - (used.get(key, 0))
```