Cod sursa(job #1850790)

Utilizator Coroian_DavidCoroian David Coroian_David Data 18 ianuarie 2017 22:03:07
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 kb
#include <cstdio>

using namespace std;

FILE *f, *g;

int str[250002][20];
int pMax[250009];

int n, m;

//char s[2000009];
/*
int crChar;

bool isDigit(char c)
{
    if(c >= '0' && c <= '9')
        return 1;

    return 0;
}


int getNr()
{
    int nr = 0;

    while(isDigit(s[crChar]))
    {
        nr = nr * 10 + s[crChar] - '0';

        crChar ++;
    }

    crChar ++;

    return nr;
}*/

void readFile()
{
    f = fopen("stramosi.in", "r");

    fscanf(f, "%d%d\n", &n, &m);

  //  fgets(s, 2000000, f);

    int i;
    for(i = 1; i <= n; i ++)
        fscanf(f, "%d", &str[i][0]);//= getNr();//, 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; i <= n; i ++)
    {
        for(j = 1; j <= 18; j ++)
            str[i][j] = str[str[i][j - 1]][j - 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;
}