Pagini recente » Cod sursa (job #1754364) | Cod sursa (job #1389900) | Cod sursa (job #1544276) | Cod sursa (job #2461869) | Cod sursa (job #145513)
Cod sursa(job #145513)
#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);}}