Cod sursa(job #92095)
#include <stdio.h>
#include <stdio.h>
#include <math.h>
class persoana
{
public:
persoana()
{
str = 0;
val = 0;
for(int i=0;i<18;++i)
stramosi[i] = 0;
}
int str;
int val;
persoana* stramosi[18];
};
int num[250001];
persoana persoane[250001];
int sol[300001];
persoana& getStr(persoana& p, int k)
{
if(k==1)
return *(p.stramosi[0]);
int p2 = 2;
int put = 1;
while(p2<=k)
{
p2*=2;
put++;
}
if(p2/2 == k)
return *(p.stramosi[put-1]);
return getStr(*(p.stramosi[put-1]), k-p2/2);
}
void fillInfo(persoana& p)
{
int k = 2;
int put = 1;
while(k<=p.str)
{
p.stramosi[put] = &(getStr(*(p.stramosi[put-1]), k/2));
put++;
k *= 2;
}
}
int main(void)
{
FILE* in;
FILE* out;
int n,m;
in = fopen("stramosi.in", "r");
out = fopen("stramosi.out", "w");
fscanf(in, "%d %d\n", &n, &m);
for(int i=0;i<n;++i)
{
int k;
fscanf(in, "%d ", &k);
num[i] = k;
}
for(int i=0;i<n;++i)
{
//persoana* p = new persoana();
persoane[i].val = i+1;
if(num[i] == 0)
{
persoane[i].str = 0;
}
else
{
persoane[i].str = persoane[num[i]-1].str+1;
persoane[i].stramosi[0] = &(persoane[num[i]-1]);
fillInfo(persoane[i]);
}
// persoane[i] = p;
}
for(int i=0;i<m;++i)
{
int p,q;
fscanf(in, "%d %d\n", &q, &p);
if(p>persoane[q-1].str)
sol[i] = 0;
else
sol[i] = getStr(persoane[q-1], p).val;
}
for(int i=0;i<m;++i)
{
fprintf(out, "%d\n", sol[i]);
}
/* for(int i=0;i<n;++i)
{
delete persoane[i];
}
*/
fclose(in);
fclose(out);
return 0;
}