Pagini recente » Cod sursa (job #1174420) | Cod sursa (job #120950) | Cod sursa (job #461958) | Cod sursa (job #974595) | Cod sursa (job #574151)
Cod sursa(job #574151)
#include <fstream>
#include <vector>
#define pb push_back
#define mp make_pair
#include <stdlib.h>
#define TR(C, i)\
for(typeof( C.begin() ) i = C.begin(); i != C.end(); i++)
using namespace std;
const int nmax = 100005;
const int mmax = 2000005;
int N, M;
vector<int> A[nmax];
vector< pair<int, int> > Q[mmax];
int P[nmax], S[nmax], Sol[mmax];
bool color[nmax];
void read()
{
ifstream in("lca.in");
in >> N >> M;
int i, a, b;
for(i = 2; i <= N; i++)
{
in >> a;
A[a]. pb ( i );
}
for(i = 1; i <= M; i++)
{
in >> a >> b;
Q[a].pb( mp (b, i) );
Q[b].pb( mp (a, i) );
}
}
void Unite(int a, int b)
{
( rand() & 1 )? P[a] = b: P[b] = a;
}
int find(int x)
{
if(x != P[x]) return P[x] = find(P[x]);
return x;
}
void DF(int u)
{
P[u] = u;
S[u] = u;
TR(A[u], it)
{
DF(*it);
Unite(find(u), find(*it));
S[find(u)] = u;
}
color[u] = true;
TR(Q[u], it)
if(color[it -> first])
Sol[it -> second] = S[find(it -> first)];
}
void ecrire()
{
ofstream out("lca.out");
for(int i = 1; i <= M; i++)
out << Sol[i] << '\n';
}
int main()
{
read();
DF(1);
ecrire();
}