Cod sursa(job #1481406)

Utilizator silviu982001Borsan Silviu silviu982001 Data 4 septembrie 2015 13:32:45
Problema Stramosi Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 2.79 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 scrie();
void addNod(nod *&, long);
 
int main()
{
    read();
    solve();
    scrie();
     
    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)
              {
                   addNod(L[j], i);
                   d[i] = '1';
              }
     }
      
     for(i=1; i<=M; ++i)
     {
              scanf("%ld %ld", q+i, p+i);
              addNod(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 scrie()
{
     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 addNod(nod *&L, long nd)
{
     nod *x = new nod;
     x->nd = nd;
     x->next = L;
     L = x;
}