Submission #1334270

#TimeUsernameProblemLanguageResultExecution timeMemory
1334270i271828Wind Turbines (EGOI25_windturbines)C++20
11 / 100
1153 ms1114112 KiB
#include <bits/stdc++.h>
#define pii pair<int,int>
#define ll long long
using namespace std;

const int MAX=1e5+5;
const int LOG=20;

struct FT{
	ll A[2*MAX];
	ll qry(int x){
		x++;
		ll a=0;
		while (x>0&&x<2*MAX) a+=A[x],x+=x&-x;
		return a;
	}
	void upd(int x,ll a){
		x++;
		while (x>0&&x<2*MAX) A[x]+=a,x-=x&-x;
	}
	void upd(int x,int y,ll a){
		upd(y,a);
		upd(x-1,-a);
	}
} *ft=new FT();

struct UFDS{
	int par[MAX],sz[MAX];
	UFDS(){
		for (int i=0;i<MAX;i++) par[i]=i,sz[i]=0;
	}
	int qry(int x){
		if (x==par[x]) return x;
		return par[x]=qry(par[x]);
	}
	int mrg(int x,int y){
		x=qry(x),y=qry(y);
		if (x==y) return y;
		if (sz[x]>sz[y]) swap(x,y);
		if (sz[x]==sz[y]) sz[y]++;
		par[x]=y;
		return y;
	}
} *ud=new UFDS();

int N,M,Q;

int C[MAX];
pair<ll,pii> edg[MAX];
vector<int> adj[2*MAX];
ll W[2*MAX];

set<int> se[2*MAX];

vector<pii> E[MAX];
vector<pii> qs[MAX];

void dfs0(int x){
	if (adj[x].size()==0){
		se[x].insert(x);
		return;
	}
	int p=adj[x][0],q=adj[x][1];
	dfs0(p),dfs0(q);
	if (se[p].size()>se[q].size()) swap(p,q);
	for (auto a:se[p]){
		auto it=se[q].lower_bound(a);
		if (it!=se[q].end()) E[*it].push_back({a,x});
		if (it!=se[q].begin()) E[a].push_back({*prev(it),x});
	}
	se[x]=se[q];
	for (auto a:se[p]) se[x].insert(a);
}

int pre[2*MAX];
ll ans[MAX];

int main(){
	ios::sync_with_stdio(0);cin.tie(0);
	cin>>N>>M>>Q;
	for (int i=0;i<M;i++){
		int a,b;ll c;cin>>a>>b>>c;
		edg[i]={c,{a,b}};
	}
	for (int i=0;i<Q;i++){
		int l,r;cin>>l>>r;
		qs[r].push_back({l,i});
	}
	sort(edg,edg+M);
	ll tot=0;
	int K=N;
	for (int i=0;i<N;i++) C[i]=i;
	for (int i=0;i<M;i++){
		auto [w,pr]=edg[i];
		auto [a,b]=pr;
		a=ud->qry(a),b=ud->qry(b);
		if (a==b) continue;
		adj[K].push_back(C[a]);
		adj[K].push_back(C[b]);
		W[K]=w;
		C[ud->mrg(a,b)]=K++;
		tot+=w;
	}
	dfs0(K-1);
	for (int i=0;i<N;i++){
		for (auto [s,x]:E[i]){
			if (s<pre[x]) continue;
			ft->upd(pre[x],s,W[x]);
			pre[x]=s+1;
		}
		for (auto [l,qi]:qs[i])	ans[qi]=ft->qry(l);
	}
	for (int i=0;i<Q;i++) cout<<tot-ans[i]<<'\n';
}
#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...