Pagini recente » Cod sursa (job #654499) | Cod sursa (job #267447) | Cod sursa (job #969207) | Cod sursa (job #1621886) | Cod sursa (job #1128024)
#include <fstream>
#include <vector>
#define INF 0x33ffff
using namespace std;
ifstream d("lca.in");
ofstream o("lca.out");
const int N=1+1e6;
vector<int> a[N];
int n,m,b[3][4*N],p,nr,cmin,y,poz,ppoz[N];
bool ok,t[N];
void lca(int j)
{
int q=a[j].size();
for(int i=0; i<q; i++)
{
b[1][++p]=a[j][i];
nr++;
b[2][p]=nr;
if(!t[a[j][i]])
{
ppoz[a[j][i]]=p;
t[a[j][i]]=true;
}
lca(a[j][i]);
b[1][++p]=j;
nr--;
b[2][p]=nr;
if(!t[a[j][i]])
{
ppoz[a[j][i]]=p;
t[a[j][i]]=true;
}
}
}
int main()
{
int i,x;
d>>n>>m;
for(i=2; i<=n; i++)
{
d>>m;
a[m].push_back(i);
}
b[1][++p]=1;
b[2][p]=nr;
ppoz[1]=1;
t[1]=true;
lca(1);
while(d>>x>>y)
{
cmin=INF;
ok=false;
if(ppoz[x]<ppoz[y])
{
for(i=ppoz[x]; i<=ppoz[y]; i++)
{
if(b[1][i]==x)
ok=true;
if(ok)
if(b[2][i]<cmin)
{
cmin=b[2][i];
poz=b[1][i];
}
if(b[1][i]==y && ok)
i=ppoz[y]+1;
}
}
else
{
for(i=ppoz[y]; i<=ppoz[x]; i++)
{
if(b[1][i]==y)
ok=true;
if(ok)
if(b[2][i]<cmin)
{
cmin=b[2][i];
poz=b[1][i];
}
if(b[1][i]==x && ok)
i=ppoz[x]+1;
}
}
o<<poz<<'\n';
}
return 0;
}