Pagini recente » Cod sursa (job #3246578) | Cod sursa (job #2042294) | Cod sursa (job #57909) | Cod sursa (job #792031) | Cod sursa (job #739408)
Cod sursa(job #739408)
#include <fstream>
#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
int N, M, a;
int v[250010][20];
int gata[250010];
char dummy[10];
char pars[1750010];
ifstream fin ("stramosi.in");
ofstream fout ("stramosi.out");
void Citire ()
{
fin >> N >> M;
a = (int) log2 (N);
fin.getline (dummy, 9);
fin.getline (pars, 1750009);
int lg = strlen (pars);
int u = 1;
v[1][0] = 0;
for (int i = 0; i < lg; i++)
{
if (pars[i] >= 48 && pars[i] <= 57)
{
v[u][0] = v[u][0] * 10 + (int) pars[i] - 48;
}
else
{
if (v[u][0] == 0)
{
gata[u] = 1;
for (int j = 1; j <= a; j++)
{
v[u][j] = 0;
}
}
else gata[u] = 0;
u++;
}
}
}
void Initializare (int i)
{
if (gata[i] == 1) return;
Initializare (v[i][0]);
for (int j = 1; j <= a; j++)
{
v[i][j] = v[v[i][j - 1]][j - 1];
}
gata[i] = 1;
}
void Business ()
{
for (int i = 1; i <= N; i++)
{
Initializare (i);
}
}
void Solve ()
{
int Q, P, alfa;
for (int k = 0; k < M; k++)
{
fin.getline (pars, 100);
alfa = strlen (pars);
P = 0;
Q = 0;
for (int u = 0; u < alfa; u++)
{
if (pars[u] >= 48 && pars[u] <= 57)
{
P = P * 10 + (int) pars[u] - 48;
}
else
{
Q = P;
P = 0;
}
}
while (P > 0)
{
alfa = (int) log2 (P);
Q = v[Q][alfa];
P -= 1 << alfa;
}
fout << Q << "\n";
}
fin.close ();
fout.close ();
}
int main ()
{
Citire ();
Business ();
Solve ();
return 0;
}