Pagini recente » Cod sursa (job #3238168) | Cod sursa (job #2298022) | Cod sursa (job #2910767) | Cod sursa (job #1018670) | Cod sursa (job #2124394)
#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 (auto x : graf[nod])
{
if(x!=tata)
{
niv[x]=niv[nod]+1;
DFS(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;
}