Pagini recente » Cod sursa (job #654709) | Cod sursa (job #2138158) | Cod sursa (job #2418461) | Cod sursa (job #3196626) | Cod sursa (job #1679613)
#include <fstream>
#include <queue>
#include <vector>
#define nmax 100005
using namespace std;
vector <unsigned int> a[nmax];
unsigned int t[nmax],h;
unsigned int niv[nmax];
unsigned int log2[nmax];
unsigned int P[18][nmax];
queue <unsigned int> q;
void bfs()
{
unsigned int i,x,y;
niv[1]=1;q.push(1);
while (!q.empty())
{
x=q.front();
q.pop();
for (i=0;i<a[x].size();i++)
{
y=a[x][i];
niv[y]=niv[x]+1;
q.push(y);
}
h=max(h,niv[x]);
}
}
unsigned int querry(unsigned int p, unsigned int q)
{
int i;
if (niv[p]<niv[q]) swap(p,q);
for (i=log2[niv[p]];i>=0;i--)
{
if ((int)(niv[p]-(1<<i))>=(int)(niv[q]))
p=P[i][p];
}
if (p==q) return p;
for (i=log2[niv[p]];i>=0;i--)
{
if (P[i][p] && P[i][p]!= P[i][q])
{
p=P[i][p];
q=P[i][q];
}
}
return t[p];
}
int main()
{
ifstream f("lca.in");
ofstream g("lca.out");
unsigned int i,n,m,j,p,q;
f>>n>>m;log2[1]=0;
for (i=2;i<=n;i++)
{
f>>t[i];
a[t[i]].push_back(i);
P[0][i]=t[i];
}
bfs();
for (i=2;i<=h;i++)
{
log2[i]=log2[i/2]+1;
}
for (i=1;i<=log2[h];i++)
{
for (j=2;j<=n;j++)
{
P[i][j]=P[i-1][ P[i-1][j] ];
}
}
for (i=1;i<=m;i++)
{
f>>p>>q;
g<<querry(p,q)<<'\n';
}
f.close();
g.close();
return 0;
}