Submission #1359249

#TimeUsernameProblemLanguageResultExecution timeMemory
1359249marcogambaroWind Turbines (EGOI25_windturbines)C++20
0 / 100
100 ms26508 KiB
#include <bits/stdc++.h>
using namespace std;
mt19937 timmy_loves_gambling(73);
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define readv(v) do { for(auto &i: v) cin >> i; } while(0)
#define _ << " " <<
#define lf "\n"
#define ll long long
#define ull unsigned long long
#define pii pair<int, int>
#define pll pair<long long, long long>
#define fi first
#define se second
template<typename... Args>
using vec = vector<Args...>;
#ifndef MARCO
bool dbg = 0;
#define infor(str, ...)
#define infof(str, ...)
#else
bool dbg = 1;
#define infor(str, ...) do { fprintf(stderr, str, ##__VA_ARGS__); } while(0)
#define infof(str, ...) do { fprintf(stderr, str "\n", ##__VA_ARGS__); } while(0)
#endif

struct Dsu{
	vector<int> dsu, l, r;

	Dsu(int N) {
		dsu.resize(N, -1);
		l.resize(N);
		iota(all(l), 0);
		r = l;
	}

	int rep(int v) {
		return dsu[v] < 0? v : dsu[v] = rep(dsu[v]);
	}

	pii join(int a, int b) {
		a = rep(a);
		b = rep(b);
		if(a > b) swap(a, b);
		pii res = {r[a], l[b]};
		if(dsu[a] > dsu[b]) swap(a, b);
		l[a] = min(l[a], l[a]);
		r[a] = max(r[a], r[b]);
		dsu[a] += dsu[b];
		dsu[b] = a;
		return res;
	}
};

vec<ll> t, lazy;
void push(int v) {
	for(int u = v*2; u<v*2+2; u++) {
		t[u] += lazy[v];
		lazy[u] += lazy[v];
	}
	lazy[v] = 0;
}
ll get(int v, int l, int r, int q) {
	if(r-l == 1) return t[v];
	int m = (l+r)/2;
	push(v);
	if(q < m) return get(v*2, l, m, q);
	return get(v*2+1, m, r, q);
}
void add(int v, int l, int r, int q, ll x) {
	if(l >= q) return;
	if(r <= q) {
		lazy[v] += x;
		t[v] += x;
		return;
	}
	int m = (l+r)/2;
	push(v);
	add(v*2, l, m, q, x);
	add(v*2+1, m, r, q, x);
}

signed main(){	
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);   
    
	int N, M, Q; cin >> N >> M >> Q;
	vec<array<ll, 3>> ed(M);
	for(auto &[a, b, c]: ed) cin >> b >> c >> a;
	sort(all(ed));
	
	Dsu dsu(N);
	vec<array<ll, 3>> Qs(Q);
	for(auto &[a, b, c]: Qs) {
		static int t = 0;
		cin >> a >> b;
		c = t++;
	}

	ll mst = 0;
	vec<array<ll, 3>> qseg;
	qseg.reserve(2*N+Q);
	for(auto &[a, b, c]: Qs)
		qseg.push_back({a, b, -c-1});

	for(auto &[c, a, b]: ed) {
		if(dsu.rep(a) == dsu.rep(b)) continue;

		mst += c;
		auto [l, r] = dsu.join(a, b);
		// query must have ql <= l && qr >= r in order to avoid the extra
		qseg.push_back({l, r, c});
	}

	auto cmp = [&](array<ll, 3> &i, array<ll, 3>&j) -> bool {
		if(i[1] == j[1]) return i[2] > j[2];
		return i[1] < j[1];
	};

	sort(all(qseg), cmp);
	vec<ll> ans(Q);
	t.resize(N*4);
	lazy.resize(N*4);

	for(auto &[l, r, q]: qseg) {
		if(q < 0) {
			ans[-q-1] = mst - get(1, 0, N, l);
		}
		else {
			add(1, 0, N, l+1, q);
		}
	}

	for(auto &i: ans) cout << i << lf;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...