Cod sursa(job #66904)

Utilizator nuexistnuexist nuexist Data 21 iunie 2007 18:09:11
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <cstdio>
#include <cstdlib>
#define maxn 350005
#define maxm 400005 
#define zz sizeof(int)

int n, m;
int tata[maxn];
int st[maxn];
bool viz[maxn];
int *A[maxn], *a[maxn], *sol[maxn];
int q[maxn];
int T[maxn][3];
int t;
int poz[maxn];

void citire()
{
  freopen("stramosi.in", "r", stdin);
  scanf("%d %d\n", &n, &m);
  int i;
  for(i=1;i<=n;i++) scanf("%d ", &tata[i]);
   
  for(i=1;i<=m;i++)
    {
      int xx, yy;
      scanf("%d %d\n", &xx, &yy);
      q[xx]++;
	  T[++t][1]=xx;
      T[t][2]=yy;
    }

	for(i=0;i<=n+1;i++){ A[i]=(int *) malloc(zz); A[i][0]=0;}
	

	
   for(i=1;i<=m;i++)  
   {
		A[T[i][1]]=(int *) realloc(A[T[i][1]], zz*(A[T[i][1]][0]+2));
		A[T[i][1]][++A[T[i][1]][0]]= T[i][2];  
   }
   
  for(i=0;i<=n+1;i++) {a[i]=(int *) malloc(zz); a[i][0]=0;}
  
  for(i=1;i<=n;i++) if(tata[i])
  {
	a[tata[i]]=(int *)realloc(a[tata[i]], zz*(a[tata[i]][0]+2));
	a[tata[i]][++a[tata[i]][0]]=i;
  }	
	
   for(i=0;i<=n+1;i++) {sol[i]=(int *) malloc(zz); sol[i][0]=0;	}
	for(i=0;i<=n+1;i++)  poz[i]=1;
}

void dfs(int nod, int k)
{
  int i;
  st[k]=nod;
  viz[nod]=1;

  for(i=1;i<=A[nod][0];i++)
    if(k-A[nod][i]<1)
	{
		sol[nod]=(int *)realloc(sol[nod], zz*(sol[nod][0]+2));
	sol[nod][++sol[nod][0]]=0;
    }
    else 
	{
		sol[nod]=(int *)realloc(sol[nod],zz*(sol[nod][0]+2)); 
		sol[nod][++sol[nod][0]]=st[k-A[nod][i]];
	}
      
  for(i=1;i<=a[nod][0];i++)
    if(!viz[a[nod][i]])
      dfs(a[nod][i], k+1);
}



int main()
{
	int i, j;
	citire();  
	for(i=1;i<=n;i++) if(!tata[i]) dfs(i, 1);
	freopen("stramosi.out", "w", stdout);
	for(i=1;i<=m;i++)
		printf("%d\n", sol[T[i][1]][poz[T[i][1]]++]);
  return 0;
}