Cod sursa(job #1013827)

Utilizator stefanzzzStefan Popa stefanzzz Data 21 octombrie 2013 19:33:35
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <fstream>
#include <vector>
#define MAXC 2000000
#define MAXN 250005
#define LOGMAXN 19
using namespace std;
ifstream f("stramosi.in");
ofstream g("stramosi.out");

int n,m,tata[MAXN][LOGMAXN],x,a,cnt;
char s[MAXC];
vector<int> G[MAXN];

inline void DFS(int p);
inline int get_nr();

int main()
{
    int i;
    f>>n>>m;
    f.getline(s,MAXC,'\n');
    f.getline(s,MAXC,'\n');
    for(i=1;i<=n;i++){
        tata[i][0]=get_nr();
        G[tata[i][0]].push_back(i);}
    for(i=1;i<=n;i++)
        if(!tata[i][0])
            DFS(i);
    while(m--){
        f.getline(s,MAXC,'\n');
        cnt=0;
        a=get_nr();x=get_nr();
        for(i=LOGMAXN-1;i>=0&&x;i--)
            if(x>=(1<<i)){
                a=tata[a][i];
                x-=(1<<i);}
        g<<a<<'\n';}
    f.close();
    g.close();
    return 0;
}

inline void DFS(int p){
    int i,j;
    x=tata[p][0];
    for(i=0;x;i++){
        tata[p][i]=x;
        x=tata[x][i];}
    for(i=0;i<G[p].size();i++)
        DFS(G[p][i]);}

inline int get_nr(){
    x=s[cnt++]-'0';
    while(s[cnt]>='0'&&s[cnt]<='9')
        x=x*10+s[cnt++]-'0';
    cnt++;
    return x;}