Cod sursa(job #27833)

Utilizator cos_minBondane Cosmin cos_min Data 7 martie 2007 09:55:37
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <stdio.h>
#define DIM 250000
#define DIM2 300000
#define in "stramosi.in"
#define out "stramosi.out"

typedef struct nod {
    int vf;
    nod* next;
} NOD, *PNOD;

PNOD L[DIM];

int str[DIM], d[DIM], sel[DIM];
int p1[DIM2], p2[DIM2], apar[DIM];
int n, t = -1, v, m;

void Read();
void Add(int i, int j);
void DFS(int nod);
void Write();

int main()
{
    Read();
    DFS(0);
    Write();
    
    return 0;
}

void Read()
{
    freopen(in,"r",stdin);
    int j;
    scanf("%d %d", &n, &m ); 
        
    for ( int i = 1; i <= n; i++ )    
    {
        scanf("%d", &j ); 
        Add(i,j);
        Add(j,i);
    }
         
}

void Add(int i, int j)
{
    PNOD q = new NOD;
    q->vf = i;
    q->next = L[j];
    L[j] = q;
}

void DFS(int nod)
{
    ++v;
    t++;
    sel[nod] = 1;
    d[v] = t;
    str[v] = nod;
    apar[nod] = v;
    for ( PNOD q = L[nod]; q; q = q->next ) 
    {
        if ( !sel[q->vf])
        {
            DFS(q->vf);
        }    
    }
    t = t - 1;  
}

void Write()
{
    freopen(out,"w",stdout);
    int sursa,x, di, dist, ok = 0, j, pas;
    for ( int i = 1; i <= m; i++ )
    {   
         scanf("%d %d", &p1[i], &p2[i]); 
        ok = 0;
        di = 0;
        sursa = p1[i]; 
        x = p2[i]; 
        dist = d[apar[sursa]];
        j = apar[sursa];
        pas = 0;
        
        if ( dist - x > 0 )
        {
           while ( ok == 0 )
           {
              if ( dist > d[j] )
              {
                 dist = d[j];
                 di += 1;
                 pas = 1;
              }
              else
              {
                  if ( dist == d[j] ) pas = 1;
                  else                pas = d[j]-dist;
              }    
              if ( di == x ) ok = 1;
              if ( j == 1 ) ok = 1;
              j-=pas;
           }
           printf("%d\n",str[j+1]);        
       }
       else printf("0\n");   
                
    }   
}