Submission #402623

#TimeUsernameProblemLanguageResultExecution timeMemory
402623hoaphat1Bridges (APIO19_bridges)C++17
0 / 100
3081 ms4536 KiB
#include<bits/stdc++.h>
 
using namespace std;

template <typename A, typename B>
string to_string(pair<A, B> p);
 
template <typename A, typename B, typename C>
string to_string(tuple<A, B, C> p);
 
template <typename A, typename B, typename C, typename D>
string to_string(tuple<A, B, C, D> p);
 
string to_string(const string& s) {
  return '"' + s + '"';
}
 
string to_string(const char* s) {
  return to_string((string) s);
}
 
string to_string(bool b) {
  return (b ? "true" : "false");
}
 
string to_string(vector<bool> v) {
  bool first = true;
  string res = "{";
  for (int i = 0; i < static_cast<int>(v.size()); i++) {
    if (!first) {
      res += ", ";
    }
    first = false;
    res += to_string(v[i]);
  }
  res += "}";
  return res;
}
 
template <size_t N>
string to_string(bitset<N> v) {
  string res = "";
  for (size_t i = 0; i < N; i++) {
    res += static_cast<char>('0' + v[i]);
  }
  return res;
}
 
template <typename A>
string to_string(A v) {
  bool first = true;
  string res = "{";
  for (const auto &x : v) {
    if (!first) {
      res += ", ";
    }
    first = false;
    res += to_string(x);
  }
  res += "}";
  return res;
}
 
template <typename A, typename B>
string to_string(pair<A, B> p) {
  return "(" + to_string(p.first) + ", " + to_string(p.second) + ")";
}
 
template <typename A, typename B, typename C>
string to_string(tuple<A, B, C> p) {
  return "(" + to_string(get<0>(p)) + ", " + to_string(get<1>(p)) + ", " + to_string(get<2>(p)) + ")";
}
 
template <typename A, typename B, typename C, typename D>
string to_string(tuple<A, B, C, D> p) {
  return "(" + to_string(get<0>(p)) + ", " + to_string(get<1>(p)) + ", " + to_string(get<2>(p)) + ", " + to_string(get<3>(p)) + ")";
}
 
void debug_out() { cerr << endl; }
 
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) {
  cerr << " " << to_string(H);
  debug_out(T...);
}
 
#ifdef LOCAL
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#else
#define debug(...) 42
#endif

struct dsu {
	struct node {
		int* p;
		int val;
		int time;
	};
	vector<node> event = {{NULL, 0, -1}};
	vector<int> p;
	int n;
	dsu(int n) {
		resize(n);
	}
	dsu() {
	}
	void resize(int _n) {
		n = _n;
		p = vector<int> (n, -1);
	}
	int count = 0;
	int get(int x, bool need = false) {
		if (p[x] < 0) return x;
		if (need) event.push_back({&p[x], p[x], count});
		return p[x] = get(p[x], need);
	}
	bool unite(int x, int y, bool need = false) {
		x = get(x, need); y = get(y, need);
		if (x != y) {
			if (p[x] < p[y]) swap(x, y);
			if (need) {
				event.push_back({&p[x], p[x], count});
				event.push_back({&p[y], p[y], count});
			}
			p[y] += p[x];
			p[x] = y;
			return true;
		}
		return false;
	}
	void recall() {
		while (event.back().time == count) {
			*event.back().p = event.back().val;
			event.pop_back();
		}
		--count;
	}
};

struct edge {
	int u;
	int v;
	int w;
};

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	int _, n, m;
	//cin >> _;
	cin >> n >> m;
	vector<edge> edges;
	for (int i = 0; i < m; i++) {
		int u, v, w;
		cin >> u >> v >> w;
		--u; --v;
		edges.push_back({u, v, w});
	}
	int q;
	cin >> q;
	vector<tuple<int, int, int>> Query;
	for (int i = 0; i < q; i++) {
		int t, u, w;
		cin >> t >> u >> w;
		--u;
		Query.emplace_back(t, u, w);
	}
	int sq = sqrt(q);
	vector<bool> kt(m);
	vector<int> ans(q);
	vector<int> to(m);
	for (int i = 0; i < m; i++) to[i] = edges[i].w;
	for (int l = 0; l < q; l += sq) {
		int r = min(q, l + sq);
		dsu d(n);
		vector<int> ask;
		vector<int> udp;
		vector<int> rem;
		for (int i = l; i < r; i++) {
			if (get<0>(Query[i]) == 1) {
				if (!kt[get<1>(Query[i])]) {
					kt[get<1>(Query[i])] = true;
					rem.push_back(get<1>(Query[i]));
				}
				udp.push_back(i);
			}
			else ask.push_back(i);
		}
		vector<int> id;
		for (int i = 0; i < m; i++) if (!kt[i]) id.push_back(i);
		sort(id.begin(), id.end(), [&](int i, int j) {
			return edges[i].w > edges[j].w;
		});
		debug(id);
		sort(ask.begin(), ask.end(), [&](int i, int j) {
			return get<2>(Query[i]) > get<2>(Query[j]);
		});
		for (int i = 0, j = 0; i < (int) ask.size(); i++) {
			int pos = ask[i];
			while (j < (int) id.size() && edges[id[j]].w >= get<2>(Query[pos])) {
				d.unite(edges[id[j]].u, edges[id[j]].v);
				j++;
			}
			d.count++;
			for (int i = 0; i < (int) udp.size(); i++) {
				int j = udp[i];
				if (j > pos) break;
				to[get<1>(Query[j])] = get<2>(Query[j]);
			}
			for (auto&x : rem) {
				if (to[x] >= get<2>(Query[pos])) {
					d.unite(edges[x].u, edges[x].v, 1);
				}
				to[x] = edges[x].w;
			}
			ans[pos] = -d.p[d.get(get<1>(Query[pos]))];
			d.recall();
		}
		for (auto&i : udp) {
			kt[get<1>(Query[i])] = false;
			edges[get<1>(Query[i])].w = get<2>(Query[i]);
			to[get<1>(Query[i])] = get<2>(Query[i]);
		}
	}
	for (int i = 0; i < q; i++) if (get<0>(Query[i]) == 2) cout << ans[i] << "\n";
}

Compilation message (stderr)

bridges.cpp: In function 'int main()':
bridges.cpp:90:20: warning: statement has no effect [-Wunused-value]
   90 | #define debug(...) 42
      |                    ^~
bridges.cpp:194:3: note: in expansion of macro 'debug'
  194 |   debug(id);
      |   ^~~~~
bridges.cpp:149:6: warning: unused variable '_' [-Wunused-variable]
  149 |  int _, n, m;
      |      ^
#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...