Pagini recente » Cod sursa (job #1173065) | Cod sursa (job #2346119) | Cod sursa (job #638229) | Cod sursa (job #2338226) | Cod sursa (job #1562058)
#include <stdio.h>
#include <ctype.h>
const int nmax=100001;
const int buffsize=65536;
char buff2[buffsize];
int bzb=buffsize;
inline char urm(FILE *f)
{
if (bzb == buffsize)
{
fread(buff2,1,buffsize,f);
bzb=0;
}
return buff2[bzb++];
}
inline int citire(FILE *f)
{
int nr=0;
char c;
do
{
c=urm(f);
}
while (!isdigit(c));
do
{
nr=nr*10+c-'0';
c=urm(f);
}
while (isdigit(c));
return nr;
}
struct element
{
int nod,next;
};
inline int min(int a, int b)
{
if (a < b)
return a;
return b;
}
inline void swp(int &a, int &b)
{
int aux;
if (a > b)
{
aux=a;
a=b;
b=aux;
}
}
int head[nmax];
int level[2*nmax];
int euler[2*nmax];
bool ap[nmax];
int first[nmax];
int query[19][nmax*2];
int lg[nmax*2];
element buff[nmax-1];
int pos;
inline void push(int n1, int n2, int pos)
{
buff[pos].nod=n2;
buff[pos].next=head[n1];
head[n1]=pos;
}
void dfs(int nod, int lvl)
{
int i;
first[nod]=pos;
level[pos]=lvl;
euler[pos]=nod;
ap[nod]=true;
pos++;
i=head[nod];
while (i)
{
if (!ap[buff[i].nod])
{
dfs(buff[i].nod,lvl+1);
level[pos]=lvl;
euler[pos]=nod;
pos++;
}
i=buff[i].next;
}
}
void rmq()
{
int i,j;
for (i=0; i<pos; i++)
query[0][i]=i+1;///initializari
for (i=1; (1 << i) < pos; i++)
for (j=0; j + (1 << i) <= pos; j++)
{
query[i][j]=query[i-1][j];
if (level[query[i-1][j+ (1 << (i-1))]] < level[query[i][j]])
query[i][j]=query[i-1][j+ (1 << (i-1))];
}
}
void precalclg()
{
int i;
lg[1]=0;
for (i=2; i<=pos; i++)
lg[i]=lg[i/2]+1;
}
int main()
{
FILE *f,*f2;
int n,m,i,x,y,aux,a,b,ans;
f=fopen("lca.in","r");
f2=fopen("lca.out","w");
n=citire(f);
m=citire(f);
for (i=2; i<=n; i++)
{
x=citire(f);
push(x,i,i-1);
}
pos=1;
dfs(1,0);
pos=pos-1;
rmq();
precalclg();
for (i=1; i<=m; i++)
{
x=citire(f);
y=citire(f);
a=first[x];
b=first[y];
swp(a,b);
aux=lg[b-a+1];
ans=min(query[aux][a-1],query[aux][b - (1 << aux)]);
fprintf(f2,"%d\n",euler[ans]);
}
fclose(f);
fclose(f2);
}