Cod sursa(job #2191318)

Utilizator Coroian_DavidCoroian David Coroian_David Data 2 aprilie 2018 15:29:09
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <cstdio>
 
using namespace std;
 
FILE *f, *g;
 
int str[20][250002];
//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(j = 1; j <= 18; j ++)
    for(i = 1; i <= n; i ++)
    {
        
            str[j][i] = str[j - 1]  [str[j -1][i]] ;//, 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);
 
        p2 = 0;
 
        stramos = q;
 
        while(p > 0)
        {
          //  printf("*\n");
            if(p & 1)
                stramos = str[p2][stramos];
 
            p2 ++;
 
            p /= 2;
        }
 
        fprintf(g, "%d\n", stramos);
 
    }
 
    fclose(f);
    fclose(g);
}
 
int main()
{
    readFile();
 
    solve();
 
    answerQuestions();
 
    return 0;
}