Pagini recente » Cod sursa (job #1970531) | Cod sursa (job #3287233) | Cod sursa (job #2712125) | Cod sursa (job #1347410) | Cod sursa (job #429894)
Cod sursa(job #429894)
#include<fstream>
#include<vector>
#define pk push_back
#define nmax 100100
using namespace std;
int eu[2*nmax],niv[2*nmax],padre[nmax],beg[nmax],rmq[18][2*nmax],lg[2*nmax];
vector <int> v[nmax];
void dfs(int nod, int nivel)
{
eu[++eu[0]]=nod;
niv[eu[0]]=nivel;
beg[nod]=eu[0];
vector<int>::iterator fiu;
for(fiu=v[nod].begin();fiu!=v[nod].end();fiu++)
dfs(*fiu,nivel+1);
if(padre[nod])
{
eu[++eu[0]]=padre[nod];
niv[eu[0]]=nivel-1;
}
}
int main()
{
int n,m,i,t,j,x,y,l;
ifstream f("lca.in");
ofstream g("lca.out");
f>>n>>m;
for(i=2;i<=n;i++)
{
f>>padre[i];
v[padre[i]].pk(i);
}
dfs(1,0);
lg[1]=0;
for(i=2;i<=eu[0];i++)
lg[i]=lg[i>>1]+1;
for(i=1;i<=eu[0];i++)
rmq[0][i]=i;
for(j=1;j<=lg[eu[0]];j++)
for(i=1;j<=lg[eu[0]+1-i];i++)
{
t=j-1;
if(niv[rmq[t][i]]<niv[rmq[t][i+(1<<t)]])
rmq[j][i]=rmq[t][i];
else
rmq[j][i]=rmq[t][i+(1<<t)];
}
while(m--)
{
f>>x>>y;
x=beg[x];
y=beg[y];
if(x>y)
{
t=x;
x=y;
y=t;
}
l=lg[y-x+1];
if(niv[rmq[l][x]]<niv[rmq[l][y+1-(1<<l)]])
g<<eu[rmq[l][x]]<<'\n';
else
g<<eu[rmq[l][y+1-(1<<l)]]<<'\n';
}
return 0;
}