Pagini recente » Rating Rat Natalia (NatyDog) | Cod sursa (job #2910263) | Cod sursa (job #296711) | Cod sursa (job #2649963) | Cod sursa (job #2357771)
#include <cstdio>
#define N 100002
#include <vector>
using namespace std;
FILE *f,*g;
int rmq[18][2*N],nivel[N],where[N],nr,log[N];
vector <int> fiu[N];
void RMQ()
{///rmq[i][j] memorez nodul de pe nivelul cel mai mic din intervalul (j,j+2^i-1)
int poz=1,n1,n2;
for(int i=1;i<=log[nr];++i)
{
for(int j=1;j+poz<=nr;++j)
{
n1=nivel[rmq[i-1][j]];
n2=nivel[rmq[i-1][j+poz]];
if(n1<n2)
rmq[i][j]=rmq[i-1][j];
else
rmq[i][j]=rmq[i-1][j+poz];
}
poz*=2;
}
}
void dfs(int nod)
{
rmq[0][++nr]=nod;
where[nod]=nr;///memorez prima aparitie a fiecarui nod
for(int i=0;i<fiu[nod].size();++i)
{
nivel[fiu[nod][i]]=nivel[nod]+1;
dfs(fiu[nod][i]);
rmq[0][++nr]=nod;
}
}
int main()
{
f=fopen("lca.in","r");
g=fopen("lca.out","w");
int m,n;
fscanf(f,"%d %d",&n,&m);
int x,y;
for(int i=2;i<=n;++i)
{
fscanf(f,"%d",&x);
fiu[x].push_back(i);
}
dfs(1);
for(int i=2;i<=nr;++i)
log[i]=log[i/2]+1;
RMQ();
int poz,dif,val,px,py,lin;
for(int i=1;i<=m;++i)
{
fscanf(f,"%d %d",&x,&y);
px=where[x];
py=where[y];
if(px>py)
swap(px,py);
dif=py-px+1;
lin=log[dif];
poz=(1<<lin);
if(nivel[x]<nivel[y])
val=rmq[lin][px];
else
val=rmq[lin][py-poz+1];
fprintf(g,"%d\n",val);
}
return 0;
}