Submission #490317

#TimeUsernameProblemLanguageResultExecution timeMemory
490317dooompyBridges (APIO19_bridges)C++17
100 / 100
1948 ms32568 KiB
#include "bits/stdc++.h" using namespace std; using ll = long long; const int B = 1000; int u[100005], v[100005], d[100005]; int t[100005], a[100005], b[100005]; vector<int> to_add[1005]; int par[100005], sz[100005]; int ans[100005]; stack<int> st; void reset() { iota(par + 1, par + 100001, 1); fill(sz, sz + 100005, 1); } int find(int a) { while (a != par[a]) a = par[a]; return a; } void onion(int a, int b) { a = find(a), b = find(b); if (a == b) return; if (sz[a] < sz[b]) swap(a, b); sz[a] += sz[b]; par[b] = par[a]; st.push(b); } void rollback(int s) { while (st.size() > s) { int k = st.top(); st.pop(); sz[par[k]] -= sz[k]; par[k] = k; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); // freopen("", "r", stdin); // freopen("", "w", stdout); int n, m; cin >> n >> m; for (int i = 1; i <= m; i++) { cin >> u[i] >> v[i] >> d[i]; } int q; cin >> q; for (int i = 1; i <= q; i++) { cin >> t[i] >> a[i] >> b[i]; } for (int l = 1; l <= q; l += B) { int r = min(l + B, q + 1); reset(); vector<int> ask, update, unchanged; vector<bool> changes(100005); for (int i = l; i < r; i++) { if (t[i] == 2) { // ask ask.push_back(i); } else { // change update.push_back(i); changes[a[i]] = true; } } for (int i = 1; i <= m; i++) { if (!changes[i]) { unchanged.push_back(i); } } for (int i = l; i < r; i++) { if (t[i] == 1) { d[a[i]] = b[i]; } else { to_add[i-l].clear(); for (auto x : update) { if (d[a[x]] >= b[i]) { to_add[i - l].push_back(a[x]); } } } } sort(ask.begin(), ask.end(), [](int x, int y) { return b[x] > b[y]; }); sort(unchanged.begin(), unchanged.end(), [](int x, int y) { return d[x] > d[y]; }); int ptr = 0; for (int j : ask) { while (ptr < unchanged.size() && d[unchanged[ptr]] >= b[j]) { onion(u[unchanged[ptr]], v[unchanged[ptr]]); ptr++; } int now = st.size(); for (auto a : to_add[j - l]) { onion(v[a], u[a]); } ans[j] = sz[find(a[j])]; rollback(now); } } for (int i = 1; i <= q; i++) { if (t[i] == 2) cout << ans[i] << "\n"; } }

Compilation message (stderr)

bridges.cpp: In function 'void rollback(int)':
bridges.cpp:36:22: warning: comparison of integer expressions of different signedness: 'std::stack<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   36 |     while (st.size() > s) {
      |            ~~~~~~~~~~^~~
bridges.cpp: In function 'int main()':
bridges.cpp:112:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  112 |             while (ptr < unchanged.size() && d[unchanged[ptr]] >= b[j]) {
      |                    ~~~~^~~~~~~~~~~~~~~~~~
#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...