Pagini recente » Cod sursa (job #474517) | Cod sursa (job #732665) | Cod sursa (job #988435) | Cod sursa (job #283778) | Cod sursa (job #608475)
Cod sursa(job #608475)
#include <stdio.h>
#define MaxN 250001
#define MaxM 300001
int sol[MaxM],nodnivel[MaxN];
int radacini[MaxN];
struct intrebare{
int nP;
int nr;
intrebare* prev;
} intrebari[MaxN]; // intrebarile corespunzatoare nodului i
struct fiu{
int nod;
fiu *prev;
}fii[MaxN];
void dfs(int nod , int nivel);
int main(int argc, char* argv[])
{
int M,N;
int P,Q;
int i,j;
int nrrad=0;
int tata;
intrebare* auxi;
fiu* auxf;
FILE *fpr,*fpw;
fpr = fopen("stramosi.in","r");
fpw = fopen("stramosi.out","w");
fscanf(fpr,"%d %d",&N,&M);
for(i=1;i<=N;i++){
fscanf(fpr,"%d",&tata);
if(tata == 0){
nrrad++;
radacini[nrrad] = i;
continue;
}
auxf = new fiu; // stocare arbore pe baza de lista de fii
auxf->nod = i;
auxf->prev = fii[tata].prev;
fii[tata].prev = auxf;
}
for(i=1;i<=M;i++){
fscanf(fpr,"%d %d",&Q,&P);
auxi = new intrebare;
auxi->nP = P;
auxi->nr = i;
auxi->prev = intrebari[Q].prev;
intrebari[Q].prev = auxi;
}
for(i=1;i<=nrrad;i++)
dfs(radacini[i],1);
for(i=1;i<=M;i++)
fprintf(fpw,"%d\n",sol[i]);
fclose(fpr);
fclose(fpw);
return 0;
}
void dfs(int nod ,int nivel)
{
nodnivel[nivel] = nod ;
fiu* f;
intrebare* i;
i = intrebari[nod].prev;
while(i!=NULL){
if(i->nP < nivel)
sol[i->nr] = nodnivel[nivel-i->nP];
else
sol[i->nr] = 0;
i = i->prev;
}
f = fii[nod].prev;
while(f!=NULL){
dfs(f->nod,nivel+1);
f=f->prev;
}
}