Cod sursa(job #2135021)

Utilizator patcasrarespatcas rares danut patcasrares Data 18 februarie 2018 15:33:26
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include<fstream>
#include<algorithm>
#define x first
#define y second
#define DM 30005
#define DN 15005
using namespace std;
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
int n,m,k,f,g,c,t,pr[DN],l,p1,p2,rez[DN];
pair<int,pair<int,int> >a[DM];
pair<pair<int,int>,pair<int,int> >r[DN];
int getpr(int nod)
{
    if(pr[nod]==nod)
        return pr[nod];
    pr[nod]=getpr(pr[nod]);
    return pr[nod];
}
int main()
{
    fin>>n>>m>>k;
    for(int i=1;i<=m;i++)
        fin>>a[i].y.x>>a[i].y.y>>a[i].x;
    for(int i=1;i<=k;i++)
    {
        r[i].x.y=i;
        fin>>r[i].y.x>>r[i].y.y;
    }
    sort(a+1,a+m+1);
    for(int h=15;h>=0;h--)
    {
        l=0;
        for(int i=1;i<=n;i++)
            pr[i]=i;
        sort(r+1,r+k+1);
        for(int i=1;i<=k;i++)
        {
            t=r[i].x.x+(1<<h);
            if(t>m)
                continue;
            for(int j=l+1;j<=t;j++)
            {
                f=a[j].y.x;
                g=a[j].y.y;
                p1=getpr(f);
                p2=getpr(g);
                if(p1!=p2)
                    pr[p1]=p2;
            }
            p1=getpr(r[i].y.x);
            p2=getpr(r[i].y.y);
            if(p1!=p2)
                r[i].x.x+=(1<<h);
            l=t;
        }
    }
    for(int i=1;i<=k;i++)
        rez[r[i].x.y]=a[r[i].x.x+1].x;
    for(int i=1;i<=k;i++)
        fout<<rez[i]<<'\n';
}