Submission #1360727

#TimeUsernameProblemLanguageResultExecution timeMemory
1360727marcogambaroWind Turbines (EGOI25_windturbines)C++20
100 / 100
630 ms118484 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

vec<array<ll, 4>> Qsegment; // l, rl, rr, x
vector<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;
}

void add(int v, int l, int r, int ql, int qr, ll x) {
	if(qr <= l || r <= ql) return;
	if(ql <= l && r <= qr) {
		t[v] += x;
		lazy[v] += x;
		return;
	}

	push(v);
	int m = (l+r)/2;
	add(v*2, l, m, ql, qr, x);
	add(v*2+1, m, r, ql, qr, x);
}

ll get(int v, int l, int r, int q) {
	if(r-l == 1) return t[v];
	push(v);
	int m = (l+r)/2;
	if(q < m) return get(v*2, l, m, q);
	return get(v*2+1, m, r, q);
}

struct Dsu {
	vec<int> dsu;
	vec<set<int>> st;
	int n;

	Dsu(int N) {
		dsu.resize(N, -1);
		st.resize(N);
		t.resize(N*4);
		lazy.resize(N*4);
		n = N;
		for(int i=0; i<N; i++)
			st[i].emplace(i);
	}

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

	void join(int a, int b, ll x) {
		a = rep(a);
		b = rep(b);
		assert(a != b);
		if(dsu[a] > dsu[b]) swap(a, b);
		
		infof("--------\nUNITING %d %d", a, b);

		Qsegment.push_back({0, 0, n, x});
		infof("pushed [0, 0 %d, %d]", n, x);
		int h = 0;
		int k = 0;

		for(auto it = st[b].begin(); it != st[b].end(); it++) {
			auto ar = st[a].upper_bound(*it);

			if(ar != st[a].begin()) {
				ar--;
				Qsegment.push_back({k, h, *it, -x});
				infof("pushed [%d, %d %d, %d]", k, h, *it, -x);
				k = *ar+1;
				h = *it;
				ar++;
			}

			if(ar != st[a].end()) {
				auto it2 = it;
				while(it2 != st[b].end() && *it2 < *ar) it2++;
				it2--;
				Qsegment.push_back({k, h, *ar, -x});
				infof("pushed [%d, %d %d, %d]", k, h, *ar, -x);
				k = *it2+1;
				h = *ar;

				it = it2;
			}
		}
		Qsegment.push_back({k, h, n, -x});
		infof("pushed [%d, %d %d, %d]", k, h, n, -x);

		dsu[a] += dsu[b];
		dsu[b] = a;
		for(auto &i: st[b]) st[a].emplace(i);
	}
};

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));
	
	vec<pii> Qs(Q);
	vec<int> idQ(Q);
	iota(all(idQ), 0);
	for(auto &[a, b]: Qs) {
		cin >> a >> b;
	}
	sort(all(idQ), [&](int &i, int &j){return Qs[i] < Qs[j];});

	ll mst = 0;
	Dsu dsu(N);

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

	sort(all(Qsegment));
	Qsegment.push_back({(ll)1.14e9, -73, -67, -0});
	int p = 0;
	vector<ll> ans(Q, mst);

	for(auto &[l, rl, rr, x]: Qsegment) {
		while(p < Q && Qs[idQ[p]].fi < l) {
			ans[idQ[p]] -= get(1, 0, N, Qs[idQ[p]].se);
			p++;
		}

		add(1, 0, N, rl, rr, x);
	}

	for(auto &i: ans) cout << i << lf;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...