Cod sursa(job #2314878)

Utilizator SchnitzelMannPavaloiu Gabriel SchnitzelMann Data 9 ianuarie 2019 09:43:46
Problema Radiatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
ifstream in("radiatie.in");
ofstream out("radiatie.out");
vector<pair<int,int>> V[15002];
vector<int> v[15002];
int k,cst[15002],a[30002],l[30002],lg[30002],f[15002],r[30002][15],pr[15002];
priority_queue<pair<int,int>> h;
int owo[15002][30],OwO[15002][30];
void dfs(int nr,int lv)
{
    a[++k]=nr;
    l[k]=lv;
    f[nr]=k;
    for(auto it:v[nr])
    {
        dfs(it,lv+1);
        a[++k]=nr;
        l[k]=lv;
        owo[it][0]=nr;
        OwO[it][0]=cst[it];
    }
}
int cmax(int nr,int d)
{
    int mx=-(1<<29),i;
    for(i=25;i>=0;i--)
        if((1<<i)<=d)
        {
            d-=(1<<i);
            mx=max(mx,OwO[nr][i]);
            nr=owo[nr][i];
        }
    return mx;
}
int main()	
{
    int n,m,t,i,j,nr,nr1,nr2;
    in>>n>>m>>t;
    while(m--)
    {
        in>>nr1>>nr2>>nr;
        V[nr1].push_back({nr,nr2});
        V[nr2].push_back({nr,nr1});
    }
    h.push({0,1});
    pr[1]=-1;
    while(!h.empty())
    {
        nr1=h.top().y;nr2=-h.top().x;
        pr[nr1]=-pr[nr1];
        for(auto it:V[nr1])
            if(pr[it.y]==0||(pr[it.y]<0&&cst[it.y]>it.x))
            {
                cst[it.y]=it.x;
                pr[it.y]=-nr1;
                h.push({-it.x,it.y});
            }
        while(!h.empty()&&pr[h.top().y]>0)
            h.pop();
    }
    for(i=2;i<=n;i++)
        v[pr[i]].push_back(i);
    dfs(1,0);
    for(i=2;i<=k;i++)
        lg[i]=lg[i/2]+1,r[i][0]=i;
    r[1][0]=1;
    for(j=0;j<=lg[k];j++)
        for(i=0;i+(1<<j)<=k;i++)
            if(l[r[i][j]]>l[r[i+(1<<j)][j]])
                r[i][j+1]=r[i+(1<<j)][j];
            else
                r[i][j+1]=r[i][j];
    OwO[0][0]=OwO[1][0]=-(1<<29);
    for(j=1;j<26;j++)
        for(i=1;i<=n;i++)
        {
            owo[i][j]=owo[owo[i][j-1]][j-1];
            OwO[i][j]=max(OwO[i][j-1],OwO[owo[i][j-1]][j-1]);
        }
    while(t--)
    {
        in>>nr1>>nr2;
        if(nr1==nr2)
        {
            out<<"0\n";
            continue;
        }
        i=f[nr1];j=f[nr2];
        if(i>j)
            swap(i,j);
        nr=lg[j-i+1];
        nr=min(l[r[i][nr]],l[r[j-(1<<nr)+1][nr]]);
        out<<max(cmax(nr1,l[f[nr1]]-nr),cmax(nr2,l[f[nr2]]-nr))<<"\n";
    }
    return 0;	
}