Pagini recente » Cod sursa (job #92248) | Cod sursa (job #204152) | Cod sursa (job #76338) | Cod sursa (job #1973281) | Cod sursa (job #680574)
Cod sursa(job #680574)
#include <fstream>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
typedef struct NOD {
int inf;
struct NOD* next;
} NOD;
typedef struct {
NOD* prim;
} LIST;
#define NMAX 100005
LIST T[NMAX];
int n, m;
int u, v;
int P[NMAX], A[4*NMAX], B[4*NMAX];
void insereaza(LIST* L, int x)
{
NOD* p=new(NOD);
p->inf = x;
p->next = L->prim;
L->prim = p;
}
void DFS(LIST T[], int x, int p)
{
static int nr = 0;
nr++;
P[x] = nr;
A[nr] = p;
B[nr] = x;
for (NOD* q=T[x].prim; q; q=q->next){
DFS(T,q->inf,p+1);
nr++;
A[nr] = p;
B[nr] = x;
}
}
int minim(int l, int r)
{
if (l>r) swap(l,r);
int p=l;
for (int i=l+1; i<=r; i++)
if (A[p]>A[i]) p = i;
return B[p];
}
int main()
{
int x;
f >> n >> m;
for (int i=2; i<=n; i++){
f >> x;
insereaza (&T[x],i);
}
DFS(T,1,0);
for (;m--;){
f >> u >> v;
g << minim(P[u],P[v]) << '\n';
}
return 0;
}