Submission #683490

#TimeUsernameProblemLanguageResultExecution timeMemory
683490NursikBridges (APIO19_bridges)C++14
100 / 100
2013 ms12328 KiB
#include <stdio.h> #include <algorithm> #include <bitset> #include <cassert> #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> #include <deque> #include <fstream> #include <functional> #include <iomanip> #include <iostream> #include <list> #include <map> #include <queue> #include <random> #include <set> #include <sstream> #include <stack> #include <string> #include <unordered_map> #include <unordered_set> #include <vector> using namespace std; #define ll long long #define pb push_back #define mp make_pair #define f first #define s second #define ld long double #define bug cout << "bug\n"; const int maxn = 1e5 + 1, maxm = 5e4 + 1; const int mod = 1e9 + 7, inf = 1e9, block = 800, hb = 126067, base = 1000050017; const ll biginf = 5e18; const ld eps = 1e-15; using namespace std; int n, m, q; int u[maxn], v[maxn], d[maxn], used[maxn], ans[maxn]; int t[maxn]; int x[maxn], y[maxn]; vector<int> add[block + block]; struct dsu{ int p[maxm], sz[maxm]; stack<pair<int, int>> st; void init(){ for (int i = 1; i <= n; ++i){ p[i] = i, sz[i] = 1; } while (st.size() > 0){ st.pop(); } } int get(int v){ if (v == p[v]) return v; return get(p[v]); } void unite(int a, int b){ a = get(a), b = get(b); if (a == b) return; if (sz[a] > sz[b]) swap(a, b); p[a] = b; sz[b] += sz[a]; st.push(mp(a, sz[a])); } void rollback(int y){ while (st.size() != y){ pair<int, int> cur = st.top(); int r = p[cur.f]; sz[r] -= cur.s; p[cur.f] = cur.f; st.pop(); } } } rt; int main(){ ios_base::sync_with_stdio(false); cin.tie(0), cout.tie(0); cin >> n >> m; for (int i = 1; i <= m; ++i){ cin >> u[i] >> v[i] >> d[i]; } cin >> q; for (int i = 1; i <= q; ++i){ cin >> t[i]; if (t[i] == 1){ cin >> x[i] >> y[i]; } else{ cin >> x[i] >> y[i]; } } for (int i = 1; i <= q; i += block){ rt.init(); int l = i, r = min(q, i + block - 1); vector<int> changed; vector<pair<int, int>> unchanged; vector<pair<int, int>> ask; for (int j = l; j <= r; ++j){ if (t[j] == 1){ used[x[j]] = 1; changed.pb(x[j]); } else{ ask.pb(mp(y[j], j)); } } for (int j = l; j <= r; ++j){ if (t[j] == 1){ d[x[j]] = y[j]; } else{ add[j - l].clear(); for (auto it : changed){ if (d[it] >= y[j]){ add[j - l].pb(it); } } } } for (int j = 1; j <= m; ++j){ if (used[j] == 0){ unchanged.pb(mp(d[j], j)); } used[j] = 0; } sort(ask.begin(), ask.end()); sort(unchanged.begin(), unchanged.end()); int uk = (int)unchanged.size() - 1; for (int j = (int)ask.size() - 1; j >= 0; --j){ while (uk >= 0 && unchanged[uk].f >= ask[j].f){ int z = unchanged[uk].s; rt.unite(u[z], v[z]); uk -= 1; } int cur = (int)rt.st.size(); int pos = ask[j].s; for (auto it : add[pos - l]){ rt.unite(u[it], v[it]); } ans[pos] = rt.sz[rt.get(x[pos])]; rt.rollback(cur); } } for (int i = 1; i <= q; ++i){ if (t[i] == 2){ cout << ans[i] << '\n'; } } } /* */

Compilation message (stderr)

bridges.cpp: In member function 'void dsu::rollback(int)':
bridges.cpp:76:26: warning: comparison of integer expressions of different signedness: 'std::stack<std::pair<int, int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   76 |         while (st.size() != y){
      |                ~~~~~~~~~~^~~~
#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...