Cod sursa(job #3144835)

Utilizator Luca529Taschina Luca Luca529 Data 10 august 2023 20:21:13
Problema Radiatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.47 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
vector<pair<int, int> > x[15001], v[15001];
int rmq[18][100001], d[20001], dp[15][20001], T[20001], sol[20001];
int niv[20001], pa[20001], k, log2[100001];

int R(int a)
{if(a==T[a])return a;
 else return T[a]=R(T[a]);
}

void L(int a, int b)
{if(T[a]<T[b])T[b]=T[a];
 else T[a]=T[b];
}

struct Data{
int i, j, c;

bool operator <(const Data &other) const
{if(c>other.c)return 0;
 else return 1;
}

}y[30001];

void DFS(int nod, int n)
{niv[nod]=n, pa[nod]=++k, rmq[0][k]=nod;

 vector<pair<int, int> >:: iterator I;
 for(I=x[nod].begin();I<x[nod].end();I++)
 if(niv[I->first]==0)
 {DFS(I->first, n+1);
  rmq[0][++k]=nod;
 }
}

int Query(int a, int b)
{int l=log2[b-a+1];

 if(niv[rmq[l][a-1+(1<<l)]]<niv[rmq[l][b]])return rmq[l][a-1+(1<<l)];
 else return rmq[l][b];
}

void DFS1(int nod, int n)
{niv[nod]=n;
 while(v[nod].empty()!=1)
 {int l=log2[n-niv[v[nod].back().first]+1], v1;
  v1=max(dp[l][n], dp[l][niv[v[nod].back().first]-1+(1<<l)]);
  sol[v[nod].back().second]=max(sol[v[nod].back().second], v1);

  v[nod].pop_back();
 }

 vector<pair<int, int> >:: iterator I;
 for(I=x[nod].begin();I<x[nod].end();I++)
 if(niv[I->first]==0)
 {d[n+1]=I->second;
  dp[1][n+1]=I->second;
  for(int i=2;i<=log2[n+1];i++)
  dp[i][n+1]=0;

  for(int i=2;i<=log2[n+1];i++)
  dp[i][n+1]=max(dp[i-1][n+1], max(dp[i-1][n+1-(1<<(i-1))], d[n+2-(1<<(i-1))]));

  DFS1(I->first, n+1);
 }
}

int main()
{   int n, m, q, a, b, r;
    fin>>n>>m>>q;
    for(int i=1;i<=m;i++)
    fin>>y[i].i>>y[i].j>>y[i].c;

    sort(y+1, y+1+m);
    for(int i=1;i<=n;i++)
    T[i]=i;
    for(int i=1;i<=m;i++)
    {int a1=R(y[i].i), b1=R(y[i].j);
     if(a1!=b1)
     {L(a1, b1);
      x[y[i].i].push_back({y[i].j, y[i].c});
      x[y[i].j].push_back({y[i].i, y[i].c});
     }
    }
    for(int i=2;i<=100000;i++)
    log2[i]=log2[i/2]+1;

    DFS(1, 1);
    for(int i=1;i<=log2[k];i++)
    for(int j=(1<<i);j<=k;j++)
    if(niv[rmq[i-1][j-(1<<(i-1))]]<niv[rmq[i-1][j]])rmq[i][j]=rmq[i-1][j-(1<<(i-1))];
    else rmq[i][j]=rmq[i-1][j];

    for(int i=1;i<=q;i++)
    {fin>>a>>b;
     r=Query(pa[a], pa[b]);

     v[a].push_back({r, i});
     v[b].push_back({r, i});
    }

    fill(niv+1, niv+1+n, 0);
    DFS1(1, 1);

    for(int i=1;i<=q;i++)
    fout<<sol[i]<<"\n";
    return 0;
}