Pagini recente » Cod sursa (job #1535966) | Statistici Teodora Musatoiu (teodoramusatoiu) | Cod sursa (job #1150945) | Cod sursa (job #2029573) | Cod sursa (job #133717)
Cod sursa(job #133717)
#include <cstdio>
#include <cstring>
using namespace std;
#define FIN "radiatie.in"
#define FOUT "radiatie.out"
#define MAX_N 30005
int X[MAX_N];
int Y[MAX_N];
int T[MAX_N];
int H[MAX_N];
int BEST; // solutia
int N, M, i, t1, t2;
int h1, h2, x_v, y_v;
int K;
int C[MAX_N];
int Cc[MAX_N];
void sort (int st, int dr)
{
if (st < dr)
{
int i = st, j = dr;
int i_v = 1, j_v = 0;
while (i != j)
{
if (C[i] > C[j])
{
int ax = X[i]; X[i] = X[j]; X[j] = ax;
ax = Y[i]; Y[i] = Y[j]; Y[j] = ax;
ax = C[i]; C[i] = C[j]; C[j] = ax;
ax = i_v;
i_v = -j_v;
j_v = -ax;
}
i += i_v;
j += j_v;
}
--i; ++j;
while (i > st && C[i] == C[i - 1]) --i;
while (j < dr && C[j] == C[j + 1]) ++j;
sort (st, i);
sort (j, dr);
}
}
int CMP (int c)
{
while (T[c]) c = T[c];
return c;
}
int main ()
{
freopen (FIN, "r", stdin);
freopen (FOUT, "w", stdout);
scanf ("%d %d %d", &N, &M, &K);
for (i = 1; i <= M; ++i)
scanf ("%d %d %d", X + i, Y + i, C + i);
sort (1, M);
for (i = 1; i <= M; ++i)
{
t1 = CMP(X[i]);
t2 = CMP(Y[i]);
if (t1 != t2)
if (H[t1] < H[t2])
{
T[t1] = t2;
Cc[t1] = C[i];
}
else
{
T[t2] = t1;
Cc[t2] = C[i];
if (H[t1] == H[t2])
++H[t1];
}
}
for (i = 1; i <= K; ++i)
{
scanf ("%d %d", &x_v, &y_v);
h1 = h2 = 0;
t1 = x_v, t2 = y_v;
while (t1 != 0)
{
++h1;
t1 = T[t1];
}
while (t2 != 0)
{
++h2;
t2 = T[t2];
}
BEST = -1;
t1 = x_v, t2 = y_v;
while (t1 != t2)
if (h1 > h2)
{
if (BEST < Cc[t1]) BEST = Cc[t1];
--h1;
t1 = T[t1];
}
else
{
if (BEST < Cc[t2]) BEST = Cc[t2];
--h2;
t2 = T[t2];
}
printf ("%d\n", BEST);
}
return 0;
}