Pagini recente » Cod sursa (job #1445349) | Cod sursa (job #710205) | Cod sursa (job #1106955) | Cod sursa (job #1469323) | Cod sursa (job #795577)
Cod sursa(job #795577)
#include <cstdio>
#include <vector>
#define nm 100100
#define pb push_back
using namespace std;
FILE *f,*g;
int rmq[nm<<1][20],niv[nm*2],eul[nm*2],lg[2*nm],st[nm];
vector <int> a[nm];
int nn=-1,n,m,i,x,y,nr;
void dfs(int x,int nv)
{
int i;
eul[++nn]=x;
st[x]=nn;
niv[nn]=nv;
for (i=0;i<a[x].size();i++ )
{
dfs(a[x][i],nv+1);
eul[++nn]=x;
niv[nn]=nv;
}
}
void pre_rmq()
{
int i,j;
for (i=2;i<=nn;i++)
lg[i]=lg[i>>1]+1;
for (i=0;i<=nn;i++)
rmq[i][0]=i;
for (j=1,i=0;(1<<j)<nn;j++)
for (i=0;i<=nn-(1<<j);i++)
if (niv[rmq[i][j-1]]<niv[rmq[i+(1<<(j-1))][j-1]])
rmq[i][j]=rmq[i][j-1];
else
rmq[i][j]=rmq[i+(1<<(j-1))][j-1];
}
int main()
{
f=fopen("lca.in","r");
g=fopen("lca.out","w");
fscanf(f,"%d%d",&n,&m);
for (i=2;i<=n;i++)
{
fscanf(f,"%d",&x);
a[x].pb(i);
}
dfs(1,0);
pre_rmq();
int ax;
for (i=1;i<=m;i++)
{
fscanf(f,"%d%d",&x,&y);
x=st[x];
y=st[y];
if (x>y)
{
ax=x;
x=y;
y=ax;
}
nr=lg[y-x+1];
if (niv[rmq[x][nr]]<niv[rmq[y-(1<<nr)+1][nr]])
fprintf(g,"%d\n", eul[rmq[x][nr]]);
else
fprintf(g,"%d\n",eul[rmq[y-(1<<nr)+1][nr]]);
}
fclose(g);
return 0;
}