Cod sursa(job #2805940)

Utilizator marcumihaiMarcu Mihai marcumihai Data 22 noiembrie 2021 09:41:21
Problema Radiatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.12 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 a[25][50005];
int b[25][50005];





int bag=-1;

void DFS(int nod, int tata, int val)
{


    nivel[nod]=nivel[tata]+1;
    lini[++lung]=nod;
    primap[nod]=min(primap[nod], lung);

    int x=log2(nivel[nod]);
    a[0][nod]=tata;
    b[0][nod]=val;
    for(int i=1; i<=x; ++i)
    {
        a[i][nod]=a[i-1][a[i-1][nod]];
        b[i][nod]=max(b[i-1][nod], b[i-1][a[i-1][nod]]);
    }


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

}
int query(int fiu , int dist)
{
    if(dist==0)
        return 0;
    int x=log2(dist);
    return max(b[x][fiu] , query(a[x][fiu] , dist-pow(2 ,x)) );
}



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, 0);

    int x=log2(lung);

    for(int i=1; i<=lung; ++i)
        rmq[0][i]=nivel[lini[i]];

    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]=min(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=min(rmq[x][poza], rmq[x][l]);
        g<<max(query(prim , nivel[prim]-nivel[sus]) , query(secund , nivel[secund]-nivel[sus]))<<"\n";


    }


    return 0;
}