Cod sursa(job #2805772)

Utilizator marcumihaiMarcu Mihai marcumihai Data 21 noiembrie 2021 22:25:33
Problema Radiatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.61 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f ("radiatie.in");
ofstream g ("radiatie.out");

int n;
int m;
int q;
vector <pair<int,int >> v[50005];
int parinte[100005];
int lini[100005];

struct ceva
{
    int a;
    int b;
    int pret;
};
ceva muchie[150005];

int cmp(ceva A, ceva B)
{
    if(A.pret<B.pret)
        return 1;
    return 0;

}

int Find(int x)
{
    int copiex=x;
    while(parinte[copiex]!=0)
    {
        copiex=parinte[copiex];

    }
    int aux=x;
    while(parinte[x]!=0)
    {
        aux=x;
        x=parinte[x];
        parinte[aux]=copiex;
    }
    return copiex;
}

void Union(int x, int y)
{
    parinte[x]=y;
}
int lung;

int primap[100005];
int nivel[100005];
int rmq[25][50005];
int vecsus[25][50005];

int bag=-1;

void DFS(int nod, int tata)
{

    nivel[nod]=nivel[tata]+1;
    lini[++lung]=nod;
    primap[nod]=min(primap[nod], lung);
    for(int x=0; x<v[nod].size(); ++x)
    {
        if(v[nod].size()==1)
            ++bag;
        if(v[nod][x].first!=tata)
        {
            rmq[0][++bag]=v[nod][x].second;
            DFS(v[nod][x].first, nod);

            rmq[0][++bag]=v[nod][x].second;


        }
    }
    lini[++lung]=nod;

}


int main()
{
    f>>n>>m>>q;
    for(int i=1; i<=m; ++i)
    {
        int a, b, cost;
        f>>a>>b>>cost;
        muchie[i].a=a;
        muchie[i].b=b;
        muchie[i].pret=cost;

    }
    sort(muchie+1, muchie+m+1, cmp);


    int bagate=0;
    for(int i=1; i<=n; ++i)
        primap[i]=1000000000;
    for(int i=1; i<=n; ++i)
    {
        int prim=muchie[i].a;
        int secund=muchie[i].b;

        int x=Find(prim);
        int y=Find(secund);

        if(x!=y)
        {
            Union(x, y);
            ++bagate;
            v[prim].push_back({secund, muchie[i].pret});
            v[secund].push_back({prim, muchie[i].pret});
        }
        if(bagate==n-1)
            break;

    }

    DFS(1, 0);

    int x=log2(lung);

    for(int i=1; i<=x; ++i)
    {
        for(int j=1; j<=lung-pow(2, i)+1; ++j)
        {
            int l=j+pow(2, i-1);
            rmq[i][j]=max(rmq[i-1][j], rmq[i-1][l]);
        }

    }




    for(int i=1; i<=q; ++i)
    {
        int prim;
        int secund;
        f>>prim>>secund;

        int poza=min(primap[prim], primap[secund]);
        int pozb=max(primap[prim], primap[secund]);




        int x=log2(pozb-poza);
        int l=pozb-pow(2, x)+1;
        int sus=max(rmq[x][poza], rmq[x][l]);

        g<<sus<<"\n";


    }


    return 0;
}