Pagini recente » Cod sursa (job #1862145) | Cod sursa (job #2141543) | Cod sursa (job #2090864) | Rating Traian Basescu (basescu69) | Cod sursa (job #92072)
Cod sursa(job #92072)
#include <stdio.h>
#include <stdio.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];
};
persoana* persoane[250001];
int sol[300001];
persoana* getStr(persoana* p, int k)
{
if(k==0)
return p;
if(k==1)
return p->stramosi[0];
int p2 = 2;
int put = 1;
while(p2<=k)
{
p2*=2;
put++;
}
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 = 0;
fscanf(in, "%d ", &k);
persoana* p = new persoana();
p->val = i+1;
if(k == 0)
{
p->str = 0;
}
else
{
p->str = persoane[k-1]->str+1;
p->stramosi[0] = persoane[k-1];
fillInfo(p);
}
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)
//fprintf(out,"0\n");
sol[i] = 0;
else
//fprintf(out, "%d\n", getStr(persoane[q-1], p)->val);
sol[i] = getStr(persoane[q-1], p)->val;
}
for(int i=0;i<m;++i)
{
fprintf(out, "%d\n", sol[i]);
//delete persoane[i];
}
// for(int i=0;i<n;++i)
// {
// delete persoane[i];
// }
fclose(in);
fclose(out);
return 0;
}