Submission #1265854

#TimeUsernameProblemLanguageResultExecution timeMemory
1265854canhnam357Bridges (APIO19_bridges)C++20
100 / 100
1943 ms12220 KiB
// source problem : 
#include <bits/stdc++.h>
using namespace std;
#define all(x) x.begin(), x.end()
#define MASK(i) (1LL << (i))
void ckmax(int& f, int s)
{
	f = (f > s ? f : s);
}
void ckmin(int& f, int s)
{
	f = (f < s ? f : s);
}
const int B = 800;
const int N = 1e5 + 5;
int par[N], rk[N], sz[N], pt, change[N], ord_e[N], ord_q[N];
vector<int> s[N];
void init(int n)
{
	pt = 0;
   for (int i = 0; i < n; i++)
   {
   		par[i] = i;
   		rk[i] = 0;
   		sz[i] = 1;
   }
}
int get(int x) {
    if (x == par[x]) return x;
    return get(par[x]);
}

bool join(int u, int v) {
    u = get(u);
    v = get(v);
    if (u == v) return false;

    if (rk[u] < rk[v]) swap(u, v);
    par[v] = u;

    if (rk[u] == rk[v]) {
        rk[u]++;
        s[pt++] = { u,v,1, sz[v] };
    }
    else s[pt++] = { u,v,0, sz[v] };
    sz[u] += sz[v];
    return true;
}

void rollback(int cnt) {
    while (cnt--) {
        pt--;
        par[s[pt][1]] = s[pt][1];
        if (s[pt][2] == 1) rk[s[pt][0]]--;
        sz[s[pt][0]] -= s[pt][3];
        sz[s[pt][1]] = s[pt][3];
    }
}
vector<tuple<int, int, int>> q[N / B + 1];
vector<pair<int, int>> c[N];
int32_t main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	int n, m;
	cin >> n >> m;
	vector<tuple<int, int, int>> e;
	for (int i = 0; i < m; i++)
	{
		int u, v, w;
		cin >> u >> v >> w;
		e.emplace_back(--u, --v, w);
	}
	int nq;
	cin >> nq;
	for (int i = 0; i < nq; i++)
	{
		int t, l, r;
		cin >> t >> l >> r;
		q[i / B].emplace_back(t, --l, r);
	}
	vector<int> cc;
	for (int b = 0; b <= N / B; b++)
	{
		if (q[b].empty()) break;
		init(n);
		for (int i = 0; i < m; i++) change[i] = 0;
		for (auto [t, l, r] : q[b])
		{
			if (t == 1) change[l] = 1, c[l].clear();
		}
		cc.clear();
		for (int i = 0; i < m; i++)
		{
			if (change[i]) c[i].emplace_back(-1, get<2>(e[i])), cc.push_back(i);
		}
		for (int i = 0; i < q[b].size(); i++)
		{
			auto [t, l, r] = q[b][i];
			if (t == 1)
			{
				get<2>(e[l]) = r;
				c[l].emplace_back(i, r);
			}
		}
		iota(ord_e, ord_e + m, 0);
		sort(ord_e, ord_e + m, [&](int i, int j){return get<2>(e[i]) > get<2>(e[j]);});
		iota(ord_q, ord_q + q[b].size(), 0);
		vector<int> ans(q[b].size());
		sort(ord_q, ord_q + q[b].size(), [&](int i, int j){return get<2>(q[b][i]) > get<2>(q[b][j]);});
		int j = 0;
		for (int _ = 0; _ < q[b].size(); _++)
		{
			auto [t, l, r] = q[b][ord_q[_]];
			if (t == 1) continue;
			while (j < m && get<2>(e[ord_e[j]]) >= r)
			{
				if (!change[ord_e[j]]) 
				{
					join(get<0>(e[ord_e[j]]), get<1>(e[ord_e[j]]));
				}
				j++;
			}
			int cnt = 0;
			for (int u : cc)
			{
				auto it = lower_bound(all(c[u]), make_pair(ord_q[_], 0));
				it--;
				if (it->second >= r) 
				{
					auto [z, v, w] = e[u];
					cnt += join(z, v);
				}
			}
			ans[ord_q[_]] = sz[get(l)];
			rollback(cnt);
		}
		for (int i = 0; i < q[b].size(); i++)
		{
			if (get<0>(q[b][i]) == 2) cout << ans[i] << '\n';
		}
	}
	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...