Cod sursa(job #1145753)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 18 martie 2014 13:39:32
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.54 kb
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
#include <bitset>
#include <cmath>

#define Nmax 15005

using namespace std;
vector<pair<int,int> > Arb[Nmax];
bitset<Nmax>used;
priority_queue<pair<int,pair<int,int> >,
        vector<pair<int,pair<int,int> > >,
       greater<pair<int,pair<int,int> > > >Q;
int N,M,K,nre;
int daddy[Nmax];
int cost[18][2*Nmax];
int ap[Nmax],liniar[Nmax],nrl;

void read()
{
    scanf("%d%d%d",&N,&M,&K);
    int a,b,c;
    for(int i = 1; i <= M; ++i)
    {
        scanf("%d%d%d",&a,&b,&c);
        Q.push(make_pair(c,make_pair(a,b)));
    }
    for(int i = 1; i <= N; ++i)
        daddy[i] = i;
}
int whos_ur_daddy(int k)
{
    if(daddy[k] != k)
        daddy[k] = whos_ur_daddy(daddy[k]);
    return daddy[k];
}
void couple(int a,int b)
{
    daddy[daddy[a]]=daddy[b];
}

void kruskal()
{
    int a,b,c;
    while(!Q.empty())
    {
        a = Q.top().second.first;
        b = Q.top().second.second;
        c = Q.top().first;
        Q.pop();
        if(whos_ur_daddy(a)!=whos_ur_daddy(b))
        {
            couple(a,b);
            Arb[a].push_back(make_pair(c,b));
            Arb[b].push_back(make_pair(c,a));
        }
    }
}

void euler(int k,int niv)
{
    used[k] = 1;
    liniar[++nrl] = k;
    for(vector<pair<int,int> >::iterator it = Arb[k].begin(); it != Arb[k].end(); ++it )
        if(!used[it->second])
        {
            cost[0][++nre] = it->first;
            euler(it->second,niv+1);
            cost[0][++nre] = it->first;
            liniar[++nrl] = k;
        }
}

void Build()
{
    int len = (int)log2(nre),gap = 1;
    for(int k = 1; k <= len; ++k)
    {
        for(int i = 1; i <= nre; ++i)
            if(i + gap > nre) cost[k][i] = cost[k][i-1];
            else cost[k][i] = max(cost[k-1][i],cost[k-1][i+gap]);
        gap <<= 1;
    }
}

int Querry(int a,int b)
{
    int len = (int)log2(b-a+1);
    return max(cost[len][a],cost[len][b-(1<<len)+1]);
}

void solve()
{
    int a,b;
    for(int i = 1; i <= nrl; ++i)
        if(!ap[liniar[i]]) ap[liniar[i]] = i;
    for(int i = 1; i <= K; ++i)
    {
        scanf("%d%d",&a,&b);
        if(ap[a] < ap[b]) printf("%d\n",Querry(ap[a],ap[b]));
        else printf("%d\n",Querry(ap[b],ap[a]));
    }
}

int main()
{
    freopen("radiatie.in","r",stdin);
    freopen("radiatie.out","w",stdout);

    read();
    kruskal();
    for(int i = 1; i <= N; ++i)
    if(!used[i])
        euler(i,0);
    Build();
    solve();

    return 0;
}