Pagini recente » Cod sursa (job #333912) | Cod sursa (job #3203438) | Cod sursa (job #2121590) | Cod sursa (job #1892814) | Cod sursa (job #1197244)
#include <fstream>
#include <vector>
#include <utility>
#define MX 100001
#define minim(a,b) ((a<b) ? a : b)
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m;
vector<int> c[MX];
vector<int> eul;
int niv[MX], ap[MX];
int nr1,nr2;
void citire()
{
int i,x;
fin>>n>>m;
for(i=2; i<=n; i++)
{
fin>>x;
c[x].push_back(i);
}
}
void repr_euler(int p)
{
vector<int>::iterator it;
eul.push_back(p);
if(ap[p] == 0)
{
ap[p] = eul.size()-1;
}
for(it=c[p].begin(); it!=c[p].end(); it++)
{
repr_euler(*it);
eul.push_back(p);
}
}
void nivel(int p)
{
vector<int>::iterator it;
for(it=c[p].begin(); it!=c[p].end(); it++)
{
niv[*it] = niv[p]+1;
nivel(*it);
}
}
void afisare()
{
vector<int>::iterator it;
it = eul.begin(); it++;
for(; it!=eul.end(); it++) fout<<*it<<' ';
fout<<'\n';
it = eul.begin(); it++;
for(; it!=eul.end(); it++) fout<<niv[*it]<<' ';
fout<<'\n'<<ap[3];
}
int lca()
{
int a,b,m,i,x,t;
a = ap[nr1];
b = ap[nr2];
m = 2000000;
for(; a<=b; a++)
{
i = eul[a];
x = minim(m, niv[i]);
if(x < m)
{
m = x;
t = i;
}
}
return t;
}
int main()
{
citire();
eul.push_back(0);
repr_euler(1);
nivel(1);
//afisare();
int i;
for(i=1; i<=m; i++)
{
fin>>nr1>>nr2;
if(ap[nr1] > ap[nr2]) swap(nr1, nr2);
fout<<lca()<<'\n';
}
fin.close(); fout.close();
return 0;
}