Cod sursa(job #739418)

Utilizator SteveStefan Eniceicu Steve Data 23 aprilie 2012 00:31:55
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <fstream>
#include <cmath>
#include <cstring>

using namespace std;

int N, M, a;
int v[20][250010];
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[0][1] = 0;
    for (int i = 0; i < lg; i++)
    {
        if (pars[i] >= 48 && pars[i] <= 57)
        {
            v[0][u] = v[0][u] * 10 + (int) pars[i] - 48;
        }
        else
        {
            if (v[0][u] == 0)
            {
                gata[u] = 1;
                for (int j = 1; j <= a; j++)
                {
                    v[j][u] = 0;
                }
            }
            else gata[u] = 0;
            u++;
        }
    }
}

void Initializare (int i)
{
    if (gata[i] == 1) return;
    Initializare (v[0][i]);
    for (int j = 1; j <= a; j++)
    {
        v[j][i] = v[j - 1][v[j - 1][i]];
    }
    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[alfa][Q];
            P -= 1 << alfa;
        }
        fout << Q << "\n";
    }
    fin.close ();
    fout.close ();
}

int main ()
{
    Citire ();
    Business ();
    Solve ();
    return 0;
}