Pagini recente » Cod sursa (job #594537) | Cod sursa (job #42795) | Cod sursa (job #1899091) | Cod sursa (job #668854) | Cod sursa (job #272357)
Cod sursa(job #272357)
/* 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, j, aux;
j= k; target= niv[k]-urc;
if( target <1 )
printf("0\n");
else
{
if( sq < urc)
while (niv[j] > target)
j= prq[j];//printf("dammm %ld > %ld \n ", sq, urc);
while(niv[j] > target)
j= pr[j];//, printf("nub\n");
printf ("%ld\n", j);
}
}
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);
long fiu,tata;
for( i=1; i<=M; ++i)
{
scanf("%ld %ld", &fiu, &tata);
cauta(fiu ,tata);
}
fclose(stdout);
return 0;
}