Cod sursa(job #145513)

Utilizator vanila_CPPIonescu Victor Cristian vanila_CPP Data 28 februarie 2008 21:34:53
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <iostream>
#define FIN "stramosi.in"
#define FOUT "stramosi.out"
#define MAX_N 250000
#define MAX_LOG_N 20
using namespace std;
int n;
struct list{
        int inf;
        list* urm;
} *g[MAX_N+1];
int p[MAX_N+1][MAX_LOG_N+1];
int used[MAX_N+1];
int vdf[MAX_N+1];
int m,h;

void df(int);
int ancestor(int,int,int,int);


void iofile(void){
        freopen(FIN,"rt",stdin);
        freopen(FOUT,"wt",stdout);
        scanf("%d%d",&n,&m);
        list* q;
        for (int i=1,x;i<=n;i++){
                scanf("%d",&x);
                if (x){
                        q=new list;
                        q->inf=i;
                        q->urm=g[x];
                        g[x]=q;
                }
        }
        for (int i=1;i<=n;i++){
                if (!used[i]){
                        used[i]=1;
                        vdf[1]=i;
                        h=1;
                        df(i);}}
        for (int i=1,x,y;i<=m;i++){
                scanf("%d%d",&x,&y);
                printf("%d\n",ancestor(x,y,20,1048576));}
        fclose(stdin);
        fclose(stdout);
}

int main(void){
        iofile();
        return 0;
}


void df(int nod){
        list* q;
        int pw=0,pt=1;
        while (pt<h){
                p[nod][pw]=vdf[h-pt];
                pw++;
                pt*=2;
        }
        for (q=g[nod];q;q=q->urm){
                if (!used[q->inf]){
                        used[q->inf]=1;
                        vdf[++h]=q->inf;
                        df(q->inf);
                        h--;
                }
        }
}


int ancestor(int x,int nr,int pw,int pt){
        while (pt>nr){pt/=2;pw--;}
        if (pt==nr){return p[x][pw];} else{
                return ancestor(p[x][pw],nr-pt,pw,pt);}}