Pagini recente » Monitorul de evaluare | Cod sursa (job #1279223) | Cod sursa (job #1277673) | Cod sursa (job #2336114) | Cod sursa (job #689225)
Cod sursa(job #689225)
#include<fstream>
#include<vector>
#include<algorithm>
#define DIM 100001
#define pb push_back
#define INF 0x3f3f3f3f
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
vector< int > G[DIM];
int Tata[DIM], N, contor, Euler[DIM *2], Lev[DIM*2], First[DIM], minim, pos, M;
bool viz[DIM];
void DFs(int node, int level)
{
viz[node] = 1;
Lev[++contor] = level;
Euler[contor] = node;
First[node] = contor;
for(vector< int > ::iterator it = G[node].begin(); it != G[node].end(); ++it)
if( !viz[*it] )
{
DFs(*it, level+1);
Euler[++contor] = node;
Lev[contor] = level;
}
}
void lca(int x, int y)
{
int st = First[x];
int dr = First[y];
if( st > dr )
swap(st, dr);
for(int i = st; i <= dr; i++)
if( Lev[i] < minim )
{
minim = Lev[i];
pos = i;
}
}
int main()
{
int i, x, y;
in >> N >> M;
for(i = 2; i <= N; i++)
{
in >> Tata[i];
G[Tata[i]].pb(i);
}
DFs(1, 0);
for(i = 1; i <= M; i++)
{
in >> x >> y;
minim = INF;
lca(x,y);
out << Euler[pos] << '\n';
}
}