Il crescione perfetto (cesena) - TLE

Ho provato a risolvere il problema usando una DSU. Mi da errati solo alcuni testcase dove va fuori tempo ma per il resto non supera mai i 100ms quindi non riesco a capire se sia un problema di qualche edge case oppure proprio di approccio.

#include <iostream>
#include <fstream>
#include <vector>
#include <set>
using namespace std;

int parent[100000];

int root(int a)
{
	if (a == parent[a])
		return a;

	return parent[a] = root(parent[a]);
}

void connect(int a, int b)
{
    a = root(a);
    b = root(b);

    if (a != b) 
        parent[a] = b;
}

int visita(int N, int M, int K, vector<int> boot, vector<int> A, vector<int> B, vector<int> Exp)
{
    int time = 0, available = K;
    set<int> vis;

    for (int i = 0; i < N; i++)
        parent[i] = i;

    vector<vector<pair<int, int>>> edges(K+1);

    for (int i = 0; i < M; i++)
    {
        time = max(time, Exp[i]);
        edges[Exp[i]].push_back({A[i], B[i]});
    }

    for (int i = 0; i < K; i++)
    {
        vis.insert(boot[i]);
    }

    for (int i = time; i >= 1; i--)
    {
        for (auto [a, b] : edges[i])
            connect(a, b);

        for (int v : vis)
        {
            if (root(v) == root(0))
            {
                available--; 
                vis.erase(v);
                break;
            }
        }
    }

    return K - available;
}

Stai iterando su tutti i chioschi per ogni unità di tempo, controllando solo in un secondo momento se questi sono raggiungibili. Nel caso peggiore in cui nessun chiosco è raggiungibile tranne che al momento iniziale questo è quadratico.
Devi trovare un modo di avere una struttura che contiene solo i chioschi raggiungibili in un dato istante.