Cod sursa(job #3308885)

Utilizator Tudor_CCTudor Cocu Tudor_CC Data 29 august 2025 13:14:16
Problema Radiatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.23 kb
#include <bits/stdc++.h>

using namespace std;

struct el
{
    int x,y,c;
};
el s[30555];

int pr[15555]; /// parent

vector <int> v[15555];

vector <int> p[15555];

bool ord(const el & a,const el & b)
{
    if(a.c<b.c)
    {
        return true;
    }
    return false;
}

int px(int k)
{
    if(pr[k]!=k)
    {
        pr[k]=px(pr[k]);
    }
    return pr[k];
}

int d[35555]; ///depth

int nd[35555]; /// nod

int in;

int pt[25]; ///puteri

int rmq[16][35555]; /// pentru lca

int rq[16][35555]; /// pentru drumuri

int pct[16][35555]; /// pentru puncte

void dfs(int k,int h)
{
    ++in;
    d[in]=h;
    nd[in]=k;
    for(int g=0;g<v[k].size();++g)
    {

        int a=v[k][g];
        int pb=p[k][g];
          if(a!=pct[0][k])
        {



        rq[0][a]=pb;
        pct[0][a]=k;
        for(int j=1;j<=15;++j)
        {
            if(((h+1)-pt[j])>=1)
            {
                rq[j][a]=max(rq[j-1][a],rq[j-1][pct[j-1][a]]);
                pct[j][a]=pct[j-1][pct[j-1][a]];
            }
            else
            {
                break;
            }
        }
        dfs(a,h+1);
        ++in;
        d[in]=h;
        nd[in]=k;

        }
    }
}

int f[35555];

int main()
{
    ifstream cin("radiatie.in");
    ofstream cout("radiatie.out");
    int n,m,kk;
    cin>>n>>m>>kk;
    for(int i=1;i<=m;++i)
    {
        cin>>s[i].x>>s[i].y>>s[i].c;
    }
    for(int i=1;i<=n;++i)
    {
        pr[i]=i;
    }
    sort(s+1,s+m+1,ord);
    for(int i=1;i<=m;++i)
    {
        int xx,yy;
        xx=px(pr[s[i].x]);
        yy=px(pr[s[i].y]);
        if(xx!=yy)
        {
            pr[xx]=yy;
            v[s[i].x].push_back(s[i].y);
            v[s[i].y].push_back(s[i].x);
            p[s[i].x].push_back(s[i].c);
            p[s[i].y].push_back(s[i].c);
        }
    }
    pt[0]=1;
    for(int i=1;i<=15;++i)
    {
        pt[i]=pt[i-1]*2;
    }
    pct[0][1]=-1;
    dfs(1,1);
    for(int i=1;i<=in;++i)
    {
        if(f[nd[i]]==0)
        {
            f[nd[i]]=i;
        }
    }
    for(int i=1;i<=in;++i)
    {
        rmq[0][i]=i;
    }
    for(int h=1;h<=15;++h)
    {
        for(int i=1;i+pt[h]-1<=in;++i)
        {
            if(d[rmq[h-1][i]]<=d[rmq[h-1][i+pt[h-1]]])
            {
                rmq[h][i]=rmq[h-1][i];
            }
            else
            {
                rmq[h][i]=rmq[h-1][i+pt[h-1]];
            }
        }
    }
    int xa,ya,x,y;
    for(int i=1;i<=kk;++i)
    {
        cin>>xa>>ya;
        x=f[xa];
        y=f[ya];
        if(y<x)
        {
            swap(x,y);
        }
        int l=y-x+1;
        int st=0,dr=15,mij,in=-1;
        while(st<=dr)
        {
            mij=(st+dr)/2;
            if(pt[mij]<=l)
            {
                st=mij+1;
                in=mij;
            }
            else
            {
                dr=mij-1;
            }
        }
        int nod=min(d[rmq[in][x]],d[rmq[in][y-pt[in]+1]]);
        int xl,yl;
        xl=d[f[xa]];
        yl=d[f[ya]];
        x=xa;
        y=ya;
        int mx=0;
        while(xl!=nod)
        {
            st=0;
            dr=15;
            while(st<=dr)
            {
                mij=(st+dr)/2;
                if(xl-pt[mij]>=nod)
                {
                    st=mij+1;
                    in=mij;
                }
                else
                {
                    dr=mij-1;
                }
            }
            if(rq[in][x]>mx)
            {
                mx=rq[in][x];
            }
            x=pct[in][x];
            xl-=pt[in];
        }

        while(yl!=nod)
        {
            st=0;
            dr=15;
            while(st<=dr)
            {
                mij=(st+dr)/2;
                if(yl-pt[mij]>=nod)
                {
                    st=mij+1;
                    in=mij;
                }
                else
                {
                    dr=mij-1;
                }
            }
            if(rq[in][y]>mx)
            {
                mx=rq[in][y];
            }
            y=pct[in][y];
            yl-=pt[in];
        }
        cout<<mx<<"\n";
    }
    return 0;
}