Pagini recente » Cod sursa (job #2020843) | Clasament dupa rating | Cod sursa (job #492028) | Clasament dupa rating | Cod sursa (job #261753)
Cod sursa(job #261753)
#include<stdio.h>
#define max 250010
long s[max], x[300010], vz[max], t[max], n, m;
struct elem
{ long vf;
elem *urm;
} *a[max], *q;
struct cerere
{ long nc, ns;
cerere *urm;
} *b[max], *w;
FILE *f, *g;
void read()
{ long i, k, l;
f=fopen("stramosi.in", "r");
fscanf(f, "%ld%ld", &n, &m);
for(i=1; i<=n; i++)
{ fscanf(f, "%ld", &k);
t[i]=k;
if(k!=0)
{ q=new elem;
q->vf=i;
q->urm=a[k];
a[k]=q;
}
}
for(i=1; i<=m; i++)
{ fscanf(f, "%ld%ld", &k, &l);
w=new cerere;
w->ns=l; w->nc=i;
w->urm=b[k];
b[k]=w;
}
}
void solve(int k)
{ int l, o;
l=s[k];
w=b[l];
while(w)
{ o=w->ns;
if(o>k)
x[w->nc]=0;
else
x[w->nc]=s[k-o];
w=w->urm;
}
}
void df(int z,int k)
{ elem *q;
s[k]=z;
vz[z]=1;
solve(k);
q=a[z];
while(q)
{ df(q->vf, k+1);
q=q->urm;
}
}
int main()
{ long i;
read();
for(i=1; i<=n; i++)
if(vz[i]==0 && t[i]==0)
df(i, 1);
g=fopen("stramosi.out", "w");
for(i=1; i<=m; i++)
fprintf(g, "%ld ", x[i]);
fprintf(f, "\n");
fclose(g);
return 0;
}