public (int x, int y) GetRoot((int x, int y) key)
        {
            if (!parents.TryGetValue(key, out var parent))
                parents[key] = key;

            if (!parent.Equals(key))
                parents[key] = GetRoot(parents[key]);

            return parents[key];
        }


        public bool IsUnioned((int x, int y) k1, (int x, int y) k2) => GetRoot(k1).Equals(GetRoot(k2));

        public void Union((int x, int y) k1, (int x, int y) k2)
        {
            var root1 = GetRoot(k1);
            var root2 = GetRoot(k2);

            if (!IsUnioned(root1, root2))
                parents[root2] = root1;
        }