Cod sursa(job #1070030)

Utilizator IonMosnoiIon Mosnoi IonMosnoi Data 30 decembrie 2013 21:17:43
Problema Stramosi Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <stdio.h>
#include<vector>
#define pb push_back
#include <math.h> 
using namespace std;
const int  nmax = 258000,lgmax=20;

//vector < int > a[nmax];

int n,m,T[nmax],P[lgmax][nmax];//,h=0;

void dfs(int P[lgmax][nmax]){
    int i,j;
    
     for(j=1;1<<j<=n;j++)
           for(i=0;i<=n;i++)
                      P[j][i]=-1;
    P[0][0]=0;
	for(i=1;i<=n;i++)P[0][i]=T[i];
	
	
	for(j=1;1<<j<=n;j++) 
	for(i=1;i<=n;i++)	 
	   if(P[j-1][i]!=-1 )
	    P[j][i] = P[j-1][P[j-1][i]];
}



int lca(int x,int y,int T[nmax],int P[lgmax][nmax]){//x-nodul y al citilea stamos

int log;
   
   for(log=1;1<<log<=y;log++);log--;
   if(P[log][x]!=-1){
   	 x=P[log][x];
     y-=1<<log;
   }  //return y;
   while(y>0){
   	x=T[x];
	   y--;
   }
   
   return x;
   

}

int main(){
freopen("stramosi.in","r",stdin);
freopen("stramosi.out","w",stdout);
scanf("%d %d",&n,&m);
int x,y;

T[0]=0;
for(int i=1;i<=n;i++){
scanf("%d",&T[i]);
}
dfs(P);

/*	for(int j=1;j<=n;j++)
 {
          for(int i=0;1<<i<n;i++)printf("%d ",P[j][i]);
          printf("\n");
 }
*/

//printf("%d\n",lca(13,3));


for(int i=1;i<=m;i++){
	scanf("%d %d",&x,&y);
	printf("%d\n",lca(x,y,T,P));
}


fclose(stdout); fclose(stdin);
return 0;
}