Submission #1172933

#TimeUsernameProblemLanguageResultExecution timeMemory
1172933fryingducBridges (APIO19_bridges)C++20
100 / 100
2597 ms4776 KiB
#include "bits/stdc++.h"

using namespace std;

#ifdef duc_debug
#include "bits/debug.h"
#else
#define debug(...)
#endif

const int maxn = 5e4 + 4;
const int M = 1e5 + 5;
const int B = 450;

int n, m, q;
int eu[M], ev[M], ew[M];
int qo[M], qu[M], qv[M];
bool mark[M];
int lab[maxn];
stack<pair<int, int>> stk;
int lt[M];
int res[M];

int find(int u) {
  return lab[u] < 0 ? u : find(lab[u]);
}

void join(int u, int v, bool rb) {
  u = find(u), v = find(v);
  if (u == v) return;
  if (lab[u] > lab[v]) swap(u, v);
  if (rb) stk.push(make_pair(v, lab[v]));
  lab[u] += lab[v];
  lab[v] = u;
}

void rollback() {
  while (!stk.empty()) {
    auto [v, l] = stk.top();
    stk.pop();
    lab[lab[v]] -= l;
    lab[v] = l;
  }
}

void solve() {
  cin >> n >> m;
  for (int i = 1; i <= m; ++i) {
    cin >> eu[i] >> ev[i] >> ew[i];
  }
  cin >> q;
  for (int i = 1; i <= q; ++i) {
    cin >> qo[i] >> qu[i] >> qv[i];
  }
  for (int st = 1; st <= q; st += B) {
    int en = min(q, st + B - 1);
    vector<int> aft;
    vector<int> que;
    vector<int> eg;
    for (int i = st; i <= en; ++i) {
      if (qo[i] == 1) {
        mark[qu[i]] = 1;
      } else {
        que.push_back(i);
      }
    }
    for (int i = 1; i <= m; ++i) {
      if (!mark[i]) {
        aft.push_back(i);
      } else {
        eg.push_back(i);
      }
    }
    sort(aft.begin(), aft.end(), [](const int &x, const int &y) -> bool {
      return ew[x] > ew[y];
    });
    sort(que.begin(), que.end(), [](const int &x, const int &y) -> bool {
      return qv[x] > qv[y];
    });
    memset(lab, -1, sizeof(lab));
    int ptr = 0;
    for (int i = 0; i < (int)que.size(); ++i) {
      while (ptr < (int)aft.size() and ew[aft[ptr]] >= qv[que[i]]) {
        join(eu[aft[ptr]], ev[aft[ptr]], 0);
        ++ptr;
      }
      for (int j = st; j < que[i]; ++j) {
        if (qo[j] == 1) {
          lt[qu[j]] = j;
        }
      }
      for (auto j : eg) {
        if (lt[j]) {
          if (qv[lt[j]] >= qv[que[i]]) {
            join(eu[j], ev[j], 1);
          }
        } else {
          if (ew[j] >= qv[que[i]]) {
            join(eu[j], ev[j], 1);
          }
        }
      }
      res[que[i]] = -lab[find(qu[que[i]])];
      rollback();
      for (int j = st; j < que[i]; ++j) {
        if (qo[j] == 1) {
          lt[qu[j]] = 0;
        }
      }
    }
    for (int i = st; i <= en; ++i) {
      if (qo[i] == 1) {
        ew[qu[i]] = qv[i];
        mark[qu[i]] = 0;
      }
    }
  }
  for (int i = 1; i <= q; ++i) {
    if (qo[i] == 2) {
      cout << res[i] << '\n';
    }
  }
}

signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);

  solve();

  return 0;
}


#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...