Submission #1281443

#TimeUsernameProblemLanguageResultExecution timeMemory
1281443Jawad_Akbar_JJBridges (APIO19_bridges)C++20
59 / 100
3097 ms71356 KiB
#include <iostream> #include <vector> #include <stack> #include <algorithm> using namespace std; const int N = 100005, K = 320; stack<int> Par[N]; int seen[N], Sz[N], Ans[N], a[N], b[N], c[N], x[N], y[N], z[N], lst[N]; int root(int v){ while (Par[v].size() > 0) v = Par[v].top(); return v; } void solve(int n, int m, int q){ vector<pair<int,int>> vec, Quer; for (int i=1;i<=q;i++){ if (x[i] == 1) seen[y[i]] = (seen[y[i]] == 0 ? i : seen[y[i]]); else Quer.push_back({z[i], i}); } for (int i=1;i<=m;i++){ if (seen[i] == 0) vec.push_back({c[i], i}); } sort(rbegin(Quer), rend(Quer)); sort(rbegin(vec), rend(vec)); for (int i=1;i<=n;i++) Par[i] = Par[0], Sz[i] = 1; for (int i=0, id = 0;i<=vec.size();i++){ while (id < Quer.size() and (i == vec.size() or vec[i].first < Quer[id].first)){ int i1 = Quer[id].second; stack<pair<int,int>> stk; for (int j=1;j<i1;j++){ if (x[j] == 1) lst[y[j]] = j; } for (int j=1;j<i1;j++){ if (x[j] == 2 or z[j] < Quer[id].first or lst[y[j]] != j) continue; int A = root(a[y[j]]), B = root(b[y[j]]); if (Sz[A] < Sz[B]) swap(A, B); if (A != B) Par[B].push(A), Sz[A] += Sz[B], stk.push({A, B}); } for (int j=i1;j<=q;j++){ if (x[j] == 2 or seen[y[j]] != j or c[y[j]] < z[i1]) continue; int A = root(a[y[j]]), B = root(b[y[j]]); if (Sz[A] < Sz[B]) swap(A, B); if (A != B) Par[B].push(A), Sz[A] += Sz[B], stk.push({A, B}); } Ans[i1] = Sz[root(y[i1])], id++; while (stk.size() > 0){ auto [A, B] = stk.top(); stk.pop(); Par[B].pop(); Sz[A] -= Sz[B]; } } if (i < vec.size()){ int A = root(a[vec[i].second]), B = root(b[vec[i].second]); if (A != B and Sz[A] > Sz[B]) Par[B].push(A), Sz[A] += Sz[B]; else if (A != B) Par[A].push(B), Sz[B] += Sz[A]; } } for (int i=1;i<=q;i++){ seen[y[i]] = 0; if (x[i] == 2) cout<<Ans[i]<<'\n'; else c[y[i]] = z[i]; } } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int n, m, q; cin>>n>>m; for (int i=1;i<=m;i++) cin>>a[i]>>b[i]>>c[i]; cin>>q; while (q > 0){ for (int i=1;i<=min(q, K);i++) cin>>x[i]>>y[i]>>z[i]; solve(n, m, min(q, K)); q -= min(q, K); } }
#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...