Submission #1321953

#TimeUsernameProblemLanguageResultExecution timeMemory
1321953NValchanovBridges (APIO19_bridges)C++20
0 / 100
209 ms3896 KiB
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

const int MAXN = 5e4 + 10;

struct DSU
{
    int leader[MAXN];
    int sz[MAXN];

    DSU(){};

    void init(int n)
    {
        for(int i = 1; i <= n; i++)
        {
            leader[i] = i;
            sz[i] = 1;
        }
    }

    int findLeader(int u)
    {
        return leader[u] == u ? u : leader[u] = findLeader(leader[u]);
    }

    bool connected(int u, int v)
    {
        return findLeader(u) == findLeader(v);
    }

    void unite(int u, int v)
    {
        if(connected(u, v))
            return;

        u = findLeader(u);
        v = findLeader(v);

        if(sz[u] < sz[v])
            swap(u, v);

        sz[u] += sz[v];
        leader[v] = u;
    }

    int query(int u)
    {
        return sz[findLeader(u)];
    }
};

struct Edge
{
    int u, v;
    int d;

    Edge(){};

    Edge(int u, int v, int d)
    {
        this->u = u;
        this->v = v;
        this->d = d;
    }

    friend bool operator<(const Edge &e1, const Edge &e2)
    {
        return e1.d < e2.d;
    }
};

struct Query
{
    int u, w, idx;  

    Query(){};

    Query(int u, int w)
    {
        this->u = u;
        this->w = w;
    }

    friend bool operator<(const Query &q1, const Query &q2)
    {
        return q1.w < q2.w;
    }
};

int n, m, q;
DSU dsu;
Edge edges[2 * MAXN];
Query queries[2 * MAXN];
int ans[2 * MAXN];

void read()
{
    cin >> n >> m;

    for(int i = 1; i <= m; i++)
    {
        cin >> edges[i].u >> edges[i].v >> edges[i].d;
    }

    cin >> q;

    for(int i = 1; i <= q; i++)
    {
        int type;
        cin >> type;
        
        cin >> queries[i].u >> queries[i].w;
        queries[i].idx = i;
    }
}

void solve()
{
    dsu.init(n);

    sort(edges + 1, edges + m + 1);
    sort(queries + 1, queries + q + 1);

    int ptr = 1;

    for(int i = 1; i <= q; i++)
    {
        while(ptr <= m && edges[ptr].d <= queries[i].w)
        {
            dsu.unite(edges[ptr].u, edges[ptr].v);
            ptr++;
        }

        ans[queries[i].idx] = dsu.query(queries[i].u);
    }

    for(int i = 1; i <= q; i++)
    {
        cout << ans[i] << endl;
    }
}

int main()
{
    read();
    solve();

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...