Pagini recente » Cod sursa (job #1416420) | Cod sursa (job #2103970) | Cod sursa (job #1396101) | Cod sursa (job #2300295) | Cod sursa (job #351284)
Cod sursa(job #351284)
// Catalin Balan
// Infoarena - Stramosi
//Sun Sep 27 13:17:34 EEST 2009
#include <cstdio>
#include <cstdlib>
#define NMAX 250001
#define CHUNK 8192
#define FIN "stramosi.in"
#define FOUT "stramosi.out"
char g_buf[CHUNK];
int g_p = CHUNK-1;
inline int get(FILE *f)
{
int x = 0;
while (g_buf[g_p] < '0' || g_buf[g_p] > '9')
if (++g_p == CHUNK)
{
fread(g_buf,1,CHUNK,f);
g_p=0;
}
while (g_buf[g_p] >= '0' && g_buf[g_p] <= '9')
{
x = x*10 + g_buf[g_p]-'0';
if (++g_p == CHUNK)
{
fread(g_buf,1,CHUNK,f);
g_p=0;
}
}
return x;
}
int parent[NMAX][19];
void init(int n)
{
for (int j = 1; j <= 18; ++j)
{
for (int i = 1; i <= n; ++i)
{
parent[i][j]=parent[ parent[i][j-1] ][j-1];
}
}
}
int answer(int p, int q)
{
for (int i = 18; i >=0 && q; --i)
{
if (q >= (1<<i))
{
if (parent[p][i] == 0) return 0;
p = parent[p][i];
q -= 1<<i;
}
}
return p;
}
int main()
{
int n,m,p,q;
FILE *f = fopen(FIN,"r");
FILE *g = fopen(FOUT,"w");
n = get(f);
m = get(f);
for (int i = 1; i <= n; ++i)
parent[i][0]=get(f);
init(n);
for (int i = 1; i <= m; ++i)
{
p = get(f);
q = get(f);
fprintf(g,"%d\n", answer(p,q));
}
fclose(f);
fclose(g);
return EXIT_SUCCESS;
}