Pagini recente » Cod sursa (job #1347775) | Cod sursa (job #2617627) | Cod sursa (job #2487085) | Cod sursa (job #2859144) | Cod sursa (job #1347980)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define oo 2000000000
#define N 100005
using namespace std;
queue <int> q;
vector <int> a[N];
int rmq[20][2*N],lg[2*N],eu[2*N],v[2*N],poz[2*N];
int n,m,top;
void Lungime()
{
for(int i=2; i<=n; i++)
lg[i]=lg[i>>1]+1;
}
void Create_Rmq()
{
int i,j,k;
for(i=1; i<=top; i++)
rmq[0][i]=eu[i];
for(i=1; (1<<i)<=top; i++)
{
k=1<<(i-1);
for(j=1<<i; j<=top; j++)
rmq[i][j]=min(rmq[i-1][j],rmq[i-1][j-k]);
}
}
void Euler(int k)
{
int i;
v[k]=1;
eu[++top]=k;
for(int i=0; i<a[k].size(); i++)
if(!v[a[k][i]])
{
Euler(a[k][i]);
eu[++top]=k;
}
}
int Pozitiaeu()
{
int i;
for(i=1; i<=top; i++)
v[i]=0;
for(i=1; i<=top; i++)
if(!v[i]) { poz[eu[i]]=i; v[i]=1; }
}
int LCA(int x, int y)
{
int d,sol;
d=lg[y-x+1];
sol=min(rmq[d][x+(1<<d)-1],rmq[d][y]);
return sol;
}
int main()
{
ifstream fin("lca.in");
fin>>n>>m;
int i,x,d,sol,y;
for(i=2; i<=n; i++ )
{
fin>>x;
a[x].push_back(i);
}
//Ini();
//BFS();
Euler(1);
Pozitiaeu();
Lungime();
Create_Rmq();
// for(i=1; i<=top; i++)
// cout<<eu[i]<<" ";
// cout<<"\n";
ofstream fout("lca.out");
for(i=1; i<=m; i++)
{
fin>>x>>y;
// cout<<poz[x]<<" "<<poz[y]<<"\n";
if(poz[x]>poz[y]) fout<<LCA(poz[y],poz[x])<<"\n";
else fout<<LCA(poz[x],poz[y])<<"\n";
//sol=min(ad[rmq[d][x+(1<<d)-1]],ad[rmq[d][y-(1<<d)+i]]);
//cout<<sol<<"\n";
}
return 0;
}