Pagini recente » Cod sursa (job #1503770) | Cod sursa (job #3124009) | Cod sursa (job #296584) | Cod sursa (job #2617162) | Cod sursa (job #272387)
Cod sursa(job #272387)
/* Stramosi N<=250.000 M<=500.000
se da un arbore partial si m interogari de forma "k x" ( care este al k stramos al lui x)
folosim ideea cu al sqrt(n)-lea stramos
*/
#include <stdio.h>
#include <math.h>
struct nod{ int az; nod* urm;} *G[250001], *RAD;
long pr[250001],prq[250001];
long coda[250001],niv[250001];
long N,M, sq;
void DF( long k, long lvl)
{
nod *q;
coda[lvl]=k;
niv[k]=lvl;
if(lvl-sq>0 )
prq[k]=coda[lvl-sq];
// else prq[k]=coda[1];
for(q= G[k]; q; q= q->urm)
DF(q->az, lvl+1);
}
void cauta( long &k, long urc)
{
long target= niv[k]-urc;
if( target <1 )
printf("0\n");
else
{
if( sq <= urc)
for( ;niv[k] > target+sq ; k= prq[k]);
for ( ;niv[k] > target ; k= pr[k]) ;
printf ("%ld\n", k);
}
}
int main()
{
freopen("stramosi.in","r",stdin);
scanf("%ld %ld", &N, &M);
long i,a,b; nod *q;
for( i=1; i<=N; ++i)
{
scanf("%ld", &a);
if(a==0)
{
q=new nod;
q->az= i;
q->urm= RAD;
RAD= q;
}
else
{
pr[i]=a;
//q=new nod; q->az=a; q->urm=G[i]; G[i]=q;
q=new nod; q->az=i; q->urm=G[a]; G[a]=q;
}
}
sq= sqrt(N);
for( q= RAD; q; q= q->urm)
DF(q->az,1);
//for( i=1; i<=N; ++i) printf("%ld %ld %ld %ld\n", i, pr[i], prq[i] , niv[i]);
freopen("stramosi.out","w",stdout);
for( i=1; i<=M; ++i)
{
scanf("%ld %ld", &a, &b);
cauta(a,b);
}
fclose(stdout);
return 0;
}