Cod sursa(job #4545)

Utilizator sealTudose Vlad seal Data 5 ianuarie 2007 13:22:57
Problema Stramosi Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 0.9 kb
#include<stdio.h>
#include<stdlib.h>
#define Nm 250001
#define Mm 300001
int *g[Nm],d[Nm],*a[Nm],b[Nm],x[Mm],y[Mm],s[Nm],k[Nm];

void DF(int x)
{ int t,i;
  s[t=1]=x;
  for(i=0;i<b[x];i++) a[x][i]=0;
  while(t)
  { x=s[t];
    if(k[x]<d[x])
    { s[++t]=g[x][k[x]++];
      for(x=s[t],i=0;i<b[x];i++)
       if(a[x][i]<t) a[x][i]=s[t-a[x][i]];
       else a[x][i]=0; }
    else t--; } }

int main(void)
{ int i,j,n,m;
  freopen("stramosi.in","r",stdin);
  freopen("stramosi.out","w",stdout);
  scanf("%d%d",&n,&m);
  for(i=1;i<=n;i++)
  { scanf("%d",&j);
    g[j]=(int*)realloc(g[j],(d[j]+1)*sizeof(int));
    g[j][d[j]++]=i; }
  for(i=0;i<m;i++)
  { scanf("%d%d",x+i,y+i);
    a[x[i]]=(int*)realloc(a[x[i]],(b[x[i]]+1)*sizeof(int));
    a[x[i]][b[x[i]]]=y[i];
    y[i]=b[x[i]]++; }
  for(i=0;i<d[0];i++) DF(g[0][i]);
  for(i=0;i<m;i++) printf("%d\n",a[x[i]][y[i]]);
  return 0; }