Pagini recente » Cod sursa (job #1465924) | Cod sursa (job #2772932) | Cod sursa (job #2510316) | Cod sursa (job #1618722) | Cod sursa (job #1850766)
#include <cstdio>
using namespace std;
FILE *f, *g;
int str[250002][20];
int pMax[250009];
int n, m;
void readFile()
{
f = fopen("stramosi.in", "r");
fscanf(f, "%d%d", &n, &m);
int i;
for(i = 1; i <= n; i ++)
fscanf(f, "%d", &str[i][0]), printf("%d ", str[i][0]);
printf("\n");
}
void getPMax()
{
int i;
pMax[1] = 0;
for(i = 2; i <= n; i ++)
{
pMax[i] = pMax[i / 2] + 1;
//printf("%d %d\n", i, pMax[i]);
}
}
void getDinamica()
{
int i, j;
for(i = 1; (1 << i) <= n; i ++)
{
for(j = 1; j <= n; j ++)
str[j][i] = str[str[j][i - 1]][i - 1], printf("%d ", str[j][i]);
printf("\n");
}
}
void solve()
{
getPMax();
getDinamica();
}
void answerQuestions()
{
g = fopen("stramosi.out", "w");
int i, stramos, q, p, p2;
for(i = 1; i <= m; i ++)
{
fscanf(f, "%d%d", &q, &p);
if(p <= n)
{
// printf("%d\n", p);
p2 = pMax[p];
stramos = str[q][p2];
p -= (1 << p2);
//printf("%d %d\n", stramos, p);
while(p > 0 && stramos > 0)
{
// printf("*\n");
p2 = pMax[p];
stramos = str[stramos][p2];
p -= (1 << p2);
}
fprintf(g, "%d\n", stramos);
}
else
fprintf(g, "0\n");
}
fclose(f);
fclose(g);
}
int main()
{
readFile();
solve();
answerQuestions();
return 0;
}