Submission #676933

#TimeUsernameProblemLanguageResultExecution timeMemory
676933Sohsoh84Bridges (APIO19_bridges)C++17
100 / 100
2200 ms12284 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int, int> pll;

#define all(x)			(x).begin(),(x).end()
#define X			first
#define Y			second
#define sep			' '
#define endl			'\n'
#define debug(x)		cerr << #x << ": " <<  x << endl;

const int MAXN = 1e5 + 10;
const int SQ = 400;

int U[MAXN], V[MAXN], W[MAXN], par[MAXN], n, m, q, TW[MAXN],
    QT[MAXN], QA[MAXN], QB[MAXN], QANS[MAXN], sz[MAXN];

list<int> adj[MAXN];
vector<int> vis_vec;
vector<pll> events;
bool edge_mark[MAXN], vis[MAXN];

int find(int v) {
	return par[v] == v ? v : par[v] = find(par[v]);
}

inline void unite(int u, int v) {
	u = find(u), v = find(v);
	if (u == v) return;
	if (sz[u] < sz[v]) swap(u, v);

	par[v] = u;
	adj[u].splice(adj[u].end(), adj[v]);
	sz[u] += sz[v];
}

int dfs(int v, int lim) {
	vis[v] = true;
	vis_vec.push_back(v);
	int ans = sz[v];

	for (int ind : adj[v]) {
		int u = find(V[ind]) ^ find(U[ind]) ^ v;
		if (lim <= W[ind] && !vis[u])
			ans += dfs(u, lim);
	}

	return ans;
}

inline void solve(int l, int r) {
	for (int i = 1; i <= n; i++) {
		par[i] = i;
		sz[i] = 1;
		adj[i].clear();
	}

	for (int i = l; i < r; i++) {
		if (QT[i] == 1) {
			edge_mark[QA[i]] = true;
			adj[U[QA[i]]].push_back(QA[i]);
			adj[V[QA[i]]].push_back(QA[i]);
			TW[QA[i]] = W[QA[i]];
		}
	}

	for (auto [b, a] : events) {
		if (a > m && QT[a - m - 1] == 1) a = QA[a - m - 1];
		if (a <= m && (W[a] != b || edge_mark[a])) continue;
		if (a > m && (a - m - 1 < l || a - m - 1 >= r)) continue;	
		
		if (a <= m) unite(U[a], V[a]);
		else {
			a -= m + 1;
			
			for (int i = l; i < a; i++)
				if (QT[i] == 1)
					W[QA[i]] = QB[i];

			QANS[a] = dfs(find(QA[a]), b);	
			for (int e : vis_vec)
				vis[e] = false;
			vis_vec.clear();
		
			for (int i = l; i < a; i++)
				if (QT[i] == 1)
					W[QA[i]] = TW[QA[i]];
		}
	}

	for (int i = l; i < r; i++) {
		if (QT[i] == 1) {
			edge_mark[QA[i]] = false;
			W[QA[i]] = QB[i];
		}
	}
}

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] >> W[i];
		events.push_back({W[i], i});
	}

	cin >> q;
	for (int i = 0; i < q; i++) {
		cin >> QT[i] >> QA[i] >> QB[i];
		events.push_back({QB[i], m + i + 1});
	}

	sort(all(events), [] (pll a, pll b) {
		if (a.X == b.X) return a.Y < b.Y;
		return a.X > b.X;
	});

	for (int i = 0; i < q; i += SQ) {
		vector<pair<int, pll>> vec;
		solve(i, min(i + SQ, q));	
	}

	for (int i = 0; i < q; i++)
		if (QT[i] == 2) 
			cout << QANS[i] << endl;
	return 0;
}
#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...