Submission #1228632

#TimeUsernameProblemLanguageResultExecution timeMemory
1228632kunzaZa183Bridges (APIO19_bridges)C++20
46 / 100
3092 ms21468 KiB
#include <bits/stdc++.h>
using namespace std;
int main() {
  int n, m;
  cin >> n >> m;
  vector<int> u(m), v(m), w(m);
  for (int i = 0; i < m; i++) {
    cin >> u[i] >> v[i] >> w[i];
    u[i]--, v[i]--;
  }

  int qs;
  cin >> qs;

  vector<int> type(qs), x1(qs), x2(qs);
  for (int i = 0; i < qs; i++) {
    cin >> type[i] >> x1[i] >> x2[i];
    x1[i]--;
  }

  const int k = 300;

  vector<vector<int>> vvi(qs);
  vector<int> tmpw(m), ans(qs, -1);
  for (int chunk = 0; chunk * k < qs; chunk++) {
    vector<bool> changed(m, 0);
    vector<int> cureffects, ch, qries;
    for (int i = chunk * k; i < qs && i < (chunk + 1) * k; i++)
      if (type[i] == 1) {
        changed[x1[i]] = 1;
        ch.push_back(x1[i]);
        cureffects.push_back(i);
      } else {
        vvi[i] = cureffects;
        qries.push_back(i);
      }

    vector<int> noch;
    for (int i = 0; i < m; i++)
      if (!changed[i])
        noch.push_back(i);

    sort(noch.begin(), noch.end(), [&](int a, int b) { return w[a] > w[b]; });
    sort(qries.begin(), qries.end(),
         [&](int a, int b) { return x2[a] > x2[b]; });

    vector<int> dsu(n), sz(n, 1);
    iota(dsu.begin(), dsu.end(), 0);

    auto par = [&](int in, auto &&sth) {
      if (dsu[in] == in)
        return in;
      return dsu[in] = sth(dsu[in], sth);
    };

    int nochin = 0;
    for (auto a : qries) {
      while (nochin < noch.size() && (w[noch[nochin]] >= x2[a])) {
        if (par(u[noch[nochin]], par) != par(v[noch[nochin]], par)) {
          sz[par(u[noch[nochin]],par)] += sz[par(v[noch[nochin]],par)];
          dsu[par(v[noch[nochin]], par)] = par(u[noch[nochin]], par);
        }
        nochin++;
      }

      for (auto b : ch)
        tmpw[b] = w[b];

      for (auto b : vvi[a]) {
        tmpw[x1[b]] = x2[b];
      }

      map<int, vector<int>> adj;

      for (auto b : ch)
        if (tmpw[b] >= x2[a]) {
          adj[par(u[b], par)].push_back(par(v[b], par));
          adj[par(v[b], par)].push_back(par(u[b], par));
        }

      set<int> visited;
      vector<int> tmpvi2 = {par(x1[a], par)};
      while (!tmpvi2.empty()) {
        int ok = tmpvi2.back();
        tmpvi2.pop_back();

        if (visited.count(ok))
          continue;

        visited.insert(ok);

        for (auto b : adj[ok])
          tmpvi2.push_back(b);
      }

      ans[a] = 0;
      for (auto b : visited)
        ans[a] += sz[b];
    }

    for (auto a : cureffects)
      w[x1[a]] = x2[a];
  }

  for (auto a : ans)
    if (a != -1)
      cout << a << "\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...
#Verdict Execution timeMemoryGrader output
Fetching results...