Cod sursa(job #42144)

Utilizator raula_sanChis Raoul raula_san Data 28 martie 2007 21:07:53
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.32 kb
#include <stdio.h>

#define dim 250001
#define Dim 300001

long N, M;
long lv[dim], q[Dim], p[Dim];

char d[dim], Uz[dim];

struct nod
{ long nd; nod *next; } *L[dim], *X[dim];

struct list
{ long ac, c; list *next; } *Sol[dim];

void Read();
void Df(long, long);
void Solve();
void Write();
void Add(nod *&, long);

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

void Read()
{
     freopen("stramosi.in", "r", stdin);
     
     scanf("%ld %ld", &N, &M);

     long i, j;
     
     for(i=1; i<=N; ++i)
     {
              scanf("%ld", &j);
              if(j)
              {
                   Add(L[j], i);
                   d[i] = '1';
              }
     }
     
     for(i=1; i<=M; ++i)
     {
			  scanf("%ld %ld", q+i, p+i);
			  Add(X[q[i]], p[i]);
     }
              
     fclose(stdin);
}

void Df(long nd, long niv)
{
     Uz[nd] = '1';
     lv[niv] = nd;
     
     nod *x = L[nd];
     nod *y;
     
     while(x)
     {
             if(Uz[x->nd] != '1')
             {
                          y = X[x->nd];
                          
                          while(y)
						  {
								  if(niv-y->nd+1 >= 1)
								  {
									long ret = lv[niv-y->nd+1];
									list *p = new list;
									p->ac = y->nd;
									p->c = ret;
									p->next = Sol[x->nd];
									Sol[x->nd] = p;
								  }
                                  
                                  y = y->next;
                          }
                          
                          Df(x->nd, niv+1);
             }
             
             x = x->next;
     }
}

void Solve()
{
     long i;
     
     for(i=1; i<=N; ++i)
              if(d[i] != '1')
                      Df(i, 1);
}

void Write()
{
     freopen("stramosi.out", "w", stdout);
     
	 long i;
	 int ok;

	 for(i=1; i<=M; ++i)
	 {
			  list *x = Sol[q[i]];
			  ok = 0;

			  while(x)
			  {
					  if(x->ac == p[i])
					  {
							   printf("%ld\n", x->c);
							   ok = 1;
							   break;
                      }
                      x = x->next;
			  }

			  if(!ok)
				printf("0\n");
     }
     
     fclose(stdout);
}

void Add(nod *&L, long nd)
{
     nod *x = new nod;
     x->nd = nd;
     x->next = L;
     L = x;
}