Pagini recente » Cod sursa (job #107707) | Cod sursa (job #2251123) | Cod sursa (job #2172160) | Cod sursa (job #2417287) | Cod sursa (job #2124436)
#include <fstream>
#include <vector>
#include <cmath>
#define inf 0x3f3f3f3f3f3f
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
vector <int> graf[100002];
int fr[100002],niv[100002],lo[100002];
int n,m,nn,i,j,x,l,t,mm,k,a,b;
struct str
{
int val,poz;
}rmq[22][400002];
void DFS(int nod,int tata)
{
rmq[0][++nn]={niv[nod],nod};
if(!fr[nod])
fr[nod]=nn;
for (x=0;x<graf[nod].size();x++)
{
if(graf[nod][x]!=tata&&niv[graf[nod][x]]==0)
{
niv[graf[nod][x]]=niv[nod]+1;
DFS(graf[nod][x],nod);
}
}
rmq[0][++nn]={niv[tata],tata};
}
void RMQ()
{
mm=lo[nn];
k=1;
for(i=1;i<=mm;i++)
{
for(j=1;j+k<=nn;j++)
{
if(rmq[i-1][j].val>rmq[i-1][j+k].val)
{
rmq[i][j]=rmq[i-1][j];
}
else
{
rmq[i][j]=rmq[i-1][j+k];
}
}
}
}
int intreb(int a,int b)
{
l=lo[b-a+1];
t=pow(2,l);
if(rmq[l][a].poz<rmq[l][b-t+1].poz)
return rmq[l][a].poz;
else
return rmq[l][b-t+1].poz;
}
int main()
{
in>>n>>m;
for(i=1;i<n;i++)
{
in>>x;
graf[i].push_back(x);
graf[x].push_back(i);
}
niv[1]=1;
DFS(1,1);
for(i=2;i<=nn;i++)
lo[i]=lo[i/2]+1;
RMQ();
for(i=1;i<=m;i++)
{
in>>a>>b;
out<<intreb(min(fr[a],fr[b]),max(fr[a],fr[b]))<<"\n";
}
return 0;
}