Cod sursa(job #3135007)

Utilizator PHOSSESSEDProsie Radu-Teodor PHOSSESSED Data 1 iunie 2023 14:02:22
Problema Radiatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.99 kb
#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';
}