Pagini recente » Cod sursa (job #194206) | Cod sursa (job #1129280) | Cod sursa (job #914178) | Cod sursa (job #284118) | Cod sursa (job #3135007)
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;
ifstream cin("radiatie.in");
ofstream cout("radiatie.out");
class DSU
{
private: vector<int> t;
public: DSU(int n){t.resize(n + 1,0);}
int root(int a){return t[a] ? t[a] = root(t[a]) : a;}
void unite(int a,int b){if(a != b) t[a] = b;}
};
struct query
{
int a,b,id,ans;
};
struct muchie
{
int a,b,c;
muchie(int &u,int &d,int &t) : a(u),b(d),c(t) {};
};
bool cmp(const query & a,const query &b)
{
return a.ans < b.ans;
}
bool cmp1(const muchie &a,const muchie &b){return a.c < b.c;}
vector<pair<int,int>> updates = {{0,0}};
vector<query> queries; vector<muchie> muchii;
int main()
{
int n,m,q,a,b,c; cin >> n >> m >> q;
for(int i = 1; i <= m ; i++)
{
cin >> a >> b >> c;
muchii.push_back(muchie(a,b,c));
}
sort(muchii.begin(),muchii.end(),cmp1);
for(auto &it : muchii) updates.push_back({it.a,it.b});
for(int i = 1; i <= q; i++)
{
cin >> a >> b;
queries.push_back({a,b,i,0});
}
int pas = 1; while(pas <= m) pas <<= 1; pas >>= 1;
for(; pas ; pas >>= 1)
{
sort(queries.begin(),queries.end(),cmp);
DSU padure(n); int j = 0;
for(auto &it : queries)
{
if(it.ans + pas > m) continue;
while(j < (it.ans + pas))
{
j++;
int ra = padure.root(updates[j].first),rb = padure.root(updates[j].second);
padure.unite(ra,rb);
}
if(padure.root(it.a) != padure.root(it.b)) it.ans += pas;
}
}
vector<int> ans(q + 1);
for(auto& it : queries)
{
ans[it.id] = muchii[it.ans].c;
}
for(int i = 1; i <= q; i++) cout << ans[i] << '\n';
}