Cod sursa(job #739408)

Utilizator SteveStefan Eniceicu Steve Data 22 aprilie 2012 23:47:45
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#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;
}