Submission #623013

#TimeUsernameProblemLanguageResultExecution timeMemory
623013tamthegodBridges (APIO19_bridges)C++14
100 / 100
2193 ms125624 KiB
#include<bits/stdc++.h> #define pb push_back #define fi first #define se second using namespace std; using ll = long long; using ld = long double; using ull = unsigned long long; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); const int maxN = 1e5 + 5; const int mod = 1e9 + 7; const ll oo = 1e18; int n, m; int block_size = 1000; int mark[maxN]; int lab[maxN]; int res[maxN]; vector<pair<int, int>> vc; int Findset(int u) { return lab[u] < 0 ? u : Findset(lab[u]); } void Unite(int u, int v) { int r = Findset(u), s = Findset(v); if(r == s) return; if(lab[r] > lab[s]) swap(r, s); vc.pb({r, lab[r]}); vc.pb({s, lab[s]}); lab[r] += lab[s]; lab[s] = r; } void roll_back(int sz) { while(vc.size() > sz) { pair<int, int> tmp = vc.back(); vc.pop_back(); lab[tmp.fi] = tmp.se; } } struct TEdge { int u, v, w; } e[maxN]; int q; struct TQuery { int type; int s, w; } qu[maxN]; vector<int> upd[maxN]; void ReadInput() { cin >> n >> m; for(int i=1; i<=m; i++) { int u, v, w; cin >> u >> v >> w; e[i] = {u, v, w}; } cin >> q; for(int i=1; i<=q; i++) { cin >> qu[i].type >> qu[i].s >> qu[i].w; } } void Solve() { for(int i=1; i<=block_size; i++) { memset(lab, -1, sizeof lab); vc.clear(); int l = block_size * (i - 1) + 1, r = min(q, block_size * i); if(l > q) break; for(int j=1; j<=m; j++) mark[j] = 0; for(int j=l; j<=r; j++) { if(qu[j].type == 1) { mark[qu[j].s] = 1; } } vector<int> unchanged, query, changed; for(int j=1; j<=m; j++) { if(!mark[j]) unchanged.pb(j); else changed.pb(j); } for(int j=l; j<=r; j++) if(qu[j].type == 2) query.pb(j); for(int j=l; j<=r; j++) { if(qu[j].type == 1) e[qu[j].s].w = qu[j].w; else { for(int v : changed) if(e[v].w >= qu[j].w) upd[j].pb(v); } } sort(unchanged.begin(), unchanged.end(), [](int i, int j) { return e[i].w > e[j].w; }); sort(query.begin(), query.end(), [](int i, int j) { return qu[i].w > qu[j].w; }); int p = 0; for(int j : query) { while(p < unchanged.size() && e[unchanged[p]].w >= qu[j].w) { Unite(e[unchanged[p]].u, e[unchanged[p]].v); p++; } int sz = vc.size(); for(int v : upd[j]) { // if(j == 5) cout << v << " "; Unite(e[v].u, e[v].v); } res[j] = -lab[Findset(qu[j].s)]; roll_back(sz); } } for(int i=1; i<=q; i++) { if(qu[i].type == 2) cout << res[i] << '\n'; } } int32_t main() { // freopen("x.inp", "r", stdin); ios_base::sync_with_stdio(false); cin.tie(nullptr); ReadInput(); Solve(); }

Compilation message (stderr)

bridges.cpp: In function 'void roll_back(int)':
bridges.cpp:37:21: warning: comparison of integer expressions of different signedness: 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   37 |     while(vc.size() > sz)
      |           ~~~~~~~~~~^~~~
bridges.cpp: In function 'void Solve()':
bridges.cpp:121:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  121 |             while(p < unchanged.size() && e[unchanged[p]].w >= qu[j].w)
      |                   ~~^~~~~~~~~~~~~~~~~~
#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...