Cod sursa(job #1830783)

Utilizator CrystyAngelDinu Cristian CrystyAngel Data 17 decembrie 2016 09:40:20
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

ifstream fin("radiatie.in");
ofstream fout("radiatie.out");

#define nmax 15500
#define mp make_pair
#define f first
#define s second

vector <pair <int,pair<int,int> > > edge;
vector <pair<int,int> >v[nmax];
int t[nmax];
int poz[nmax];
int viz[nmax];
int w[nmax*2+1000];
int arb[nmax*4+1000];
int k,n,q,i,m;

int r(int x)
{
    if(!t[x])
        return x;
    t[x]=r(t[x]);
    return t[x];
}

void euler(int x,int cst)
{
    viz[x]=1;
    w[k]=cst;
    poz[x]=k++;

    int last;

    for(auto it:v[x])
    {
        if(viz[it.s])
            continue;
        euler(it.s,last=it.f);
        w[k++]=last;
    }
}

void build()
{
    for(int i=k-1; i>0; --i)
        arb[i]=max(arb[i<<1],arb[i<<1|1]);
}

int query(int l,int r)
{
    int ans = 0;
    for( l=l+k, r=r+k; l<r; l>>=1,r>>=1)
    {
        if(l&1)
            ans=max(ans,arb[l++]);
        if(r&1)
            ans=max(ans,arb[--r]);
    }
    return ans;
}

int main()
{
    fin>>n>>m>>q;
    for(i=0; i<m; ++i)
    {
        int x,y,c;
        fin>>x>>y>>c;
        edge.push_back(mp(c,mp(x,y)));
    }

    vector <int> graf;

    sort(edge.begin(),edge.end());
    for(i=0; i<m; ++i)
    {
        int a = r(edge[i].s.f);
        int b = r(edge[i].s.s);
        if(a != b)
        {
            t[a]=b;
            graf.push_back(i);
        }
    }
    for(i=0; i<graf.size(); ++i)
    {
        v[edge[graf[i]].s.f].push_back(mp(edge[graf[i]].f,edge[graf[i]].s.s));
        v[edge[graf[i]].s.s].push_back(mp(edge[graf[i]].f,edge[graf[i]].s.f));
    }
    k=0;
    euler(1,0);
    for(i=0; i<k; ++i)
        arb[i+k]=w[i];
    build();
    while(q--)
    {
        int a,b;
        fin>>a>>b;
        a=poz[a];
        b=poz[b];
        if(a>b)
            swap(a,b);
        fout<<query(a+1,b+1)<<'\n';
    }
}