Submission #1232276

#TimeUsernameProblemLanguageResultExecution timeMemory
1232276ThommyDBDrivers (BOI24_drivers)C++20
55 / 100
2092 ms20660 KiB
#include<bits/stdc++.h>

using namespace std;
#define int long long

const int INF = 1e16;

int n, m, u;
vector<pair<int, pair<int, int>>> edges;
vector<int> p, siz;

int find(int x){
    while(p[x]!=x) x=p[x];
    return x;
}

void unite(int a, int b){
    a=find(a);
    b=find(b);
    if(siz[a]>siz[b])swap(a, b);
    siz[a]+=siz[b];
    p[b]=a;
}

bool same(int a, int b){
    return find(a)==find(b);
}

signed main(){
    cin >> n >> m >> u;
    edges.resize(m);
    p.resize(n);
    iota(p.begin(), p.end(), 0);
    siz.resize(n, 1);
    for(int i = 0; i < m; i++){
        int a, b, t;
        cin >> a >> b >> t; a--; b--;
        edges[i]={t, {a, b}};
    }
    sort(edges.begin(), edges.end());
    edges.push_back({INF, {-1, -1}});

    vector<pair<pair<int, int>, pair<int, int>>> queries(u);
    for(int i = 0; i < u; i++){
        int p, a, b;
        cin >> a >> b >> p; a--; b--;
        queries[i]={{p, i}, {a, b}};
    }
    sort(queries.begin(), queries.end());

    vector<string> ans(u);

    int road = 0;
    for(int i = 0; i < u; i++){
        int p = queries[i].first.first, a=queries[i].second.first, b=queries[i].second.second;
        while(edges[road].first <= p){
            unite(edges[road].second.first, edges[road].second.second);
            road++;
        }
        if(same(a, b)) ans[queries[i].first.second]="TAIP";
        else ans[queries[i].first.second]="NE";
    }

    for(auto u : ans){
        cout << u << "\n";
    }
}
#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...