Cod sursa(job #1673143)

Utilizator SlevySlevoaca Stefan-Gabriel Slevy Data 3 aprilie 2016 14:57:24
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <iostream>
#include <fstream>
#define DIM 100000

using namespace std;

ifstream in("stramosi.in");
ofstream out("stramosi.out");
const int NMAX = 250005;
int sp[NMAX][20];
int n,m;
int lg[NMAX];
char buff[DIM];
int poz = 0;

void Read(int &a)
{
    while(!isdigit(buff[poz]))
        if(++poz==DIM)
            in.read(buff,DIM),poz = 0;
    a = 0;
    while(isdigit(buff[poz]))
    {
        a = a*10 + buff[poz] - '0';
        if(++poz==DIM)
            in.read(buff,DIM),poz = 0;
    }
}

void citire()
{
    Read(n);
    Read(m);
    for(int i=1;i<=n;i++)
        Read(sp[i][0]);
}

void sparse_table()
{
    for(int i=2;i<=n;i++)
        lg[i] = lg[i/2] + 1;
    for(int j=1;(1<<j)<=n;j++)
        for(int i=1;i<=n;i++)
            sp[i][j] = sp[sp[i][j-1]][j-1];
}

int main()
{
    citire();
    sparse_table();
    int x,y,k;
    for(int i=1;i<=m;i++)
    {
        Read(x);
        Read(y);
        while(y)
        {
            k = lg[y];
            x = sp[x][k];
            y = y-(1<<k);
        }
        out<<x<<"\n";
    }
    in.close();
    out.close();
    return 0;
}