Pagini recente » Cod sursa (job #2709833) | Cod sursa (job #2667443) | Cod sursa (job #2442996) | Cod sursa (job #1366613) | Cod sursa (job #3235770)
/******************************************************************************
Online C++ Compiler.
Code, Compile, Run and Debug C++ program online.
Write your code in this editor and press "Run" button to compile and execute it.
*******************************************************************************/
#include <bits/stdc++.h>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int euler[200006],m,n,i,j,x,encode[100006],rencode[100006],nr,siz,fc[100006],a,b;
vector<int>fii[100006];
queue<int>Q;
int rmq[17][200006];
int LOG[100006];
void bfs()
{ Q.push(1);
int y,i;
while (!Q.empty())
{ y=Q.front();
Q.pop();
for(i=0;i<fii[y].size();i++)
{ nr++;
encode[fii[y][i]]=nr;
rencode[nr]=fii[y][i];
Q.push(fii[y][i]);
}
}
}
void dfs(int nod)
{ euler[++siz]=encode[nod];
if(fc[encode[nod]]==0)fc[encode[nod]]=siz;
for(int i=0;i<fii[nod].size();i++)
{ dfs(fii[nod][i]);
euler[++siz]=encode[nod];
}
}
int main()
{
f>>n>>m;
for (i=1;i<n;i++)
{ f>>x;
fii[x].push_back(i+1);
}
nr++;
encode[1]=nr;
rencode[1]=1;
bfs();
dfs(1);
for (i=2;i<=siz;i++)LOG[i]=LOG[i/2]+1;
//for (i=1;i<=n;i++)cout<<fc[encode[i]]<<' '<<i<<'\n';
//for (i=1;i<=siz;i++)cout<<euler[i]<<' ';
//cout<<endl;
//for (i=1;i<=n;i++)cout<<i<<' '<<fc[encode[i]]<<'\n';
for (i=1;i<=siz;i++)rmq[0][i]=euler[i];
//cout<<siz<<' '<<LOG[siz]<<'\n';
for (i=1;i<=LOG[siz];i++)
{ for (j=1;j<=siz;j++)
{ if (j+(1<<i)>siz||rmq[i-1][j+(1<<(i-1))]==0)break;
rmq[i][j]=min( rmq[i-1][j],rmq[i-1][j+(1<<(i-1))] );
}
}
while (m--)
{ f>>a>>b;
if (fc[encode[b]]<fc[encode[a]])swap(b,a);
a=fc[encode[a]];
b=fc[encode[b]];
g<<rencode[ min(rmq[LOG[b-a+1]][a],rmq[LOG[b-a+1]][b+1-(1<<LOG[b-a+1])]) ]<<'\n';
}
return 0;
}