#include <unordered_map>
#include <unordered_set>
#include <map>
#include <vector>
#include <utility>
 
class Solution {
public:
    bool isValidSudoku(std::vector<std::vector<char>>& board) {
        std::unordered_map<int, std::unordered_set<char>> rows, cols;
        std::map<std::pair<int, int>, std::unordered_set<char>> squares;
 
        for (int i = 0; i < board.size(); i++) {
            for (int j = 0; j < board.size(); j++) {
                if (board[i][j] == '.') continue;
 
                std::pair<int, int> sqK = { i / 3, j / 3 };
                
                bool eliminationCond = (
                    (rows[i].count(board[i][j])) ||
                    (cols[j].count(board[i][j])) ||
                    (squares[sqK].count(board[i][j]))
                );
 
                if (eliminationCond) return false;
 
                rows[i].insert(board[i][j]);
                cols[j].insert(board[i][j]);
                squares[sqK].insert(board[i][j]);
            }
        }
 
        return true;
    }
};