Pagini recente » Cod sursa (job #2807844) | Cod sursa (job #844744) | Cod sursa (job #3191750) | Cod sursa (job #1667044) | Cod sursa (job #1685225)
#include<fstream>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
#define Nmax 100000
int N,M,Euler[6*Nmax+5],Poz[Nmax+5],L[2*Nmax+5],T[Nmax+5],x,y,V[6*Nmax+5],mini,pmini;
struct lista{int nod; lista *leg;} *G[Nmax+5];
bool U[Nmax];
void adaug(int i,int j)
{
lista *p;
p=new lista;
p->nod=j;
p->leg=G[i];
G[i]=p;
}
void citire()
{
f>>N>>M;
for(int i=2;i<=N;++i)
{
f>>T[i];
adaug(i,T[i]);
adaug(T[i],i);
}
}
void DFS(int nod,int lvl)
{
U[nod]=1;
Euler[++Euler[0]]=nod;
L[++L[0]]=lvl;
Poz[nod]=Euler[0];
for(lista *p=G[nod];p;p=p->leg)
if(!U[p->nod])
{
DFS(p->nod,lvl+1);
Euler[++Euler[0]]=nod;
L[++L[0]]=lvl;
}
}
void cng(int nod,int st,int dr)
{
if(st==dr)
{
V[nod]=st;
return;
}
int mij=(st+dr)/2;
if(x<=mij) cng(2*nod,st,mij);
else cng(2*nod+1,mij+1,dr);
if(L[V[2*nod]]<L[V[2*nod+1]]) V[nod]=V[2*nod];
else V[nod]=V[2*nod+1];
}
void getmin(int nod,int st,int dr)
{
if(st>=x&&dr<=y)
{
if(L[V[nod]]<mini) mini=L[V[nod]],pmini=V[nod];
return;
}
int mij=(st+dr)/2;
if(x<=mij) getmin(2*nod,st,mij);
if(y>mij) getmin(2*nod+1,mij+1,dr);
}
void BuildTree()
{
for(int i=1;i<=L[0];++i)
{
x=i,y=L[i];
cng(1,1,L[0]);
}
}
void Querry()
{
for(int i=1;i<=M;++i)
{
f>>x>>y;
x=Poz[x]; y=Poz[y];
int aux;
if(x>y)
{
aux=x;
x=y;
y=aux;
}
mini=10*Nmax; pmini=0;
getmin(1,1,L[0]);
g<<Euler[pmini]<<'\n';
}
}
int main()
{
citire();
DFS(1,0);
BuildTree();
Querry();
return 0;
}