Pagini recente » Cod sursa (job #1679221) | Cod sursa (job #415368) | Cod sursa (job #675570) | Cod sursa (job #620613) | Cod sursa (job #66754)
Cod sursa(job #66754)
#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;
}