Submission #444298

#TimeUsernameProblemLanguageResultExecution timeMemory
444298dutchBridges (APIO19_bridges)C++17
100 / 100
2050 ms9840 KiB
#include <bits/stdc++.h> using namespace std; #define F(z) while(e[z] >= 0) z = e[z]; const int MAXN = 5e4, LIM = 1e5, SQRT = 500; int n, m, q, e[MAXN], w[LIM], rb[3][SQRT], p, g[2][LIM], b[4][LIM]; bool on[LIM]; void unite(int i, bool c){ int u = g[0][i], v = g[1][i]; F(u) F(v) if(u == v) return; if(e[u] > e[v]) swap(u, v); if(c){ rb[0][p] = u, rb[1][p] = v; rb[2][p++] = e[v]; } e[u] += e[v], e[v] = u; } signed main(){ cin.tie(0)->sync_with_stdio(0); cin >> n >> m; vector<array<int, 3>> a(m); // -wt, type, time/queryID for(int i=0; i<m; ++i){ cin >> g[0][i] >> g[1][i] >> w[i]; --g[0][i], --g[1][i]; a[i] = {-w[i], 1, -1-i}; } cin >> q; a.resize(m+q); for(int i=0; i<q; ++i){ cin >> b[0][i] >> b[1][i] >> b[2][i]; --b[1][i]; a[i+m] = {-b[2][i], b[0][i], i}; } sort(a.begin(), a.end()); for(int l=0; l<q; l+=SQRT){ int r = min(q, l+SQRT); vector<int> curr; for(int i=l; i<r; ++i){ if(b[0][i] == 1){ on[b[1][i]] = 1; curr.push_back(b[1][i]); } } fill(e, e+n, -1); for(auto &i : a){ if(i[1] < 2){ int j = i[2] < 0 ? -i[2]-1 : (i[2] < l ? b[1][i[2]] : -1); if(j >= 0 && !on[j] && -i[0] == w[j]) unite(j, 0); }else if(l <= i[2] && i[2] < r){ for(int j=i[2]; --j>=l; ){ if(b[0][j] < 2 && on[b[1][j]]){ on[b[1][j]] = 0; if(b[2][j] >= -i[0]) unite(b[1][j], 1); } } for(int &j : curr) if(on[j] && w[j] >= -i[0]) unite(j, 1); F(b[1][i[2]]) b[3][i[2]] = -e[b[1][i[2]]]; for(int j=l; j<r; ++j){ if(b[0][j] < 2) on[b[1][j]] = 1; if(p) --p, e[rb[0][p]] -= (e[rb[1][p]] = rb[2][p]); } } } for(int i=l; i<r; ++i){ if(b[0][i] < 2){ on[b[1][i]] = 0; w[b[1][i]] = b[2][i]; } } } for(int i=0; i<q; ++i) if(b[0][i] > 1) cout << b[3][i] << '\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...