제출 #1177637

#제출 시각아이디문제언어결과실행 시간메모리
1177637ZicrusDrivers (BOI24_drivers)C++20
55 / 100
2039 ms854720 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

struct entry {
    ll lnk, rank;
};

struct tree {
    entry val;
    ll sz;
    tree *left, *right;
};

tree *update(tree *tr, ll lo, ll hi, ll i, entry v) {
    tr = tr ? new tree(*tr) : new tree();
    ll mid = (lo + hi) / 2;
    if (i == mid) tr->val = v;
    else if (i <= mid) tr->left = update(tr->left, lo, mid, i, v);
    else tr->right = update(tr->right, mid+1, hi, i, v);
    return tr;
}

entry get(tree *tr, ll lo, ll hi, ll i) {
    ll mid = (lo + hi) / 2;
    if (i == mid) return tr->val;
    else if (i <= mid) return get(tr->left, lo, mid, i);
    else return get(tr->right, mid+1, hi, i);
}

ll n;
vector<tree*> trees;

entry find(ll t, ll a) {
    entry v = get(trees[t], 0, n-1, a);
    if (v.lnk != a) trees[t] = update(trees[t], 0, n-1, a, v = find(t, v.lnk));
    return v;
}

tree *unite(ll t, ll a, ll b) {
    entry x = find(t, a), y = find(t, b);
    if (x.lnk == y.lnk) return trees[t];
    if (x.rank < y.rank) swap(x, y);
    tree* nw = update(trees[t], 0, n-1, y.lnk, x);
    if (x.rank == y.rank) nw = update(nw, 0, n-1, x.lnk, {x.lnk, x.rank + 1});
    return nw;
}

int main() {
    ll m, q; cin >> n >> m >> q;
    priority_queue<pair<ll, pair<ll, ll>>> pq;
    while (m--) {
        ll x, y, t; cin >> x >> y >> t; x--; y--;
        pq.push({-t, {x, y}});
    }

    trees = vector<tree*>(1);
    for (int i = 0; i < n; i++) {
        trees[0] = update(trees[0], 0, n-1, i, {i, 0});
    }

    vector<ll> ts;
    while (!pq.empty()) {
        ts.push_back(-pq.top().first);
        pair<ll, ll> cur = pq.top().second; pq.pop();
        trees.push_back(unite(trees.size()-1, cur.first, cur.second));
    }

    while (q--) {
        ll a, b, p; cin >> a >> b >> p; a--; b--;
        ll id = upper_bound(ts.begin(), ts.end(), p) - ts.begin();
        if (id == 0) {
            cout << "NE\n";
            continue;
        }
        if (find(id, a).lnk == find(id, b).lnk) cout << "TAIP\n";
        else cout << "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...