제출 #966725

#제출 시각아이디문제언어결과실행 시간메모리
966725kilkuwu다리 (APIO19_bridges)C++17
14 / 100
108 ms12996 KiB
#include <bits/stdc++.h>

#define nl '\n'

struct DSU {
  std::vector<int> e;

  DSU(int n) : e(n, -1) {}

  int find(int u) {
    return e[u] < 0 ? u : e[u] = find(e[u]);
  }
  
  bool merge(int u, int v) {
    u = find(u), v = find(v);
    if (u == v) return false;
    if (e[u] > e[v]) std::swap(u, v);
    e[u] += e[v];
    e[v] = u;
    return true;
  } 

  bool same(int u, int v) {
    return find(u) == find(v);
  }
  
  int size(int u) {
    return -e[find(u)];
  }
};

signed main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);
  
  int n, m;
  std::cin >> n >> m;
  
  std::vector<std::vector<int>> adj(n);
  struct Edge {
    int u, v, d, i;

    inline int other(int x) { return u ^ v ^ x; }

    bool operator<(const Edge& rhs) {
      return d < rhs.d;
    }
  };
  // build a centroid or sth

  std::vector<Edge> edges(m);
  for (int i = 0; i < m; i++) {
    int u, v, d;
    std::cin >> u >> v >> d;
    --u, --v;
    adj[u].emplace_back(i);
    adj[v].emplace_back(i);
    edges[i] = {u, v, d, i};
  }

  auto e = edges;

  std::sort(e.rbegin(), e.rend());

  DSU dsu(n);


  int q;
  std::cin >> q;
  std::vector<std::array<int, 3>> queries;
  std::vector<int> ans(q, -1);

  for (int i = 0; i < q; i++) {
    int t, a, b;
    std::cin >> t >> a >> b;
    --a;
    if (t == 2) {
      queries.push_back({b, a, i});
    }
  }

  std::sort(queries.rbegin(), queries.rend());

  int j = 0;

  for (int i = 0; i < (int) queries.size(); i++) {
    while (j < m && e[j].d >= queries[i].at(0)) {
      auto [u, v, d, id] = e[j];
      dsu.merge(u, v);
      j++;
    }
    ans[queries[i].at(2)] = dsu.size(queries[i].at(1));
  }

  for (int i = 0; i < q; i++) {
    if (ans[i] != -1) std::cout << ans[i] << nl;
  }
}
#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...