Submission #1159895

#TimeUsernameProblemLanguageResultExecution timeMemory
1159895ach00Drivers (BOI24_drivers)C++20
100 / 100
245 ms10360 KiB
#include <bits/stdc++.h>
using namespace std;

vector<int> pt;
vector<int> sz;

int find(int u) {
    if(pt[u] != u) pt[u] = find(pt[u]);
    return pt[u]; 
}

void unite(int u, int v) {
    u = find(u);
    v = find(v);
    if(sz[u] > sz[v]) swap(u,v);
    sz[v] += sz[u];
    pt[u] = v;
}


int main() {
    int n,m,q; cin >> n >> m >> q;
    vector<pair<int,pair<int,int>>> edges;
    
    pt.resize(n);
    sz.resize(n,1);
    for(int i = 0; i < n; i++) pt[i] = i;

    for(int i = 0; i < m; i++) {
        int x,y,t; cin >> x >> y >> t;
        x--; y--;
        edges.push_back({t,{x,y}});
    }
    sort(edges.begin(), edges.end());
    vector<pair<pair<int,int>,pair<int,int>>> queries;

    for(int i = 0; i < q; i++) {
        int a,b,p; cin >> a >> b >> p; a--; b--;
        queries.push_back({{p,i},{a,b}});
    }
    sort(queries.begin(), queries.end());
    vector<int> ans(q);
    int least_edge = 0;
    for(int i = 0; i < q; i++) {
        int a,b,p; 
        a = queries[i].second.first;
        b = queries[i].second.second;
        p = queries[i].first.first;
        while(edges[least_edge].first <= p && least_edge < m) {
            unite(edges[least_edge].second.first, edges[least_edge].second.second);
            least_edge++;
        }
        if(find(a) == find(b)) {
            ans[queries[i].first.second] = 1;
        }  else {
            ans[queries[i].first.second] = 0;
        }
    }
    for(int i = 0; i < q; i++) {
        cout << ((ans[i] == 1) ? "TAIP" : "NE") << '\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...