Pagini recente » Cod sursa (job #1544818) | Cod sursa (job #1743941) | Cod sursa (job #2425849) | Cod sursa (job #749751) | Cod sursa (job #65064)
Cod sursa(job #65064)
#include <stdio.h>
#define MAXN 250001
#define MAXM 300000
int n,m;
int p[MAXN], stramosi[MAXN], indice[MAXN], nuEFrunza[MAXN];
int nod[MAXM], rang[MAXM], gasit[MAXM], sol[MAXM];
void parcurge(int nod){
int i = 1;
do{
stramosi[i] = nod;
indice[nod] = i;
nod = p[nod];
i++;
}
while(nod);
}
void clear(){
int i = 1;
while(stramosi[i]){
indice[stramosi[i]] = 0;
stramosi[i] = 0;
i++;
}
}
void rezolva(){
int i, j;
for(i = 1; i <= n; i++)
if(!nuEFrunza[i]){
parcurge(i);
for(j = 0; j < m; j++)
if(indice[nod[j]] && !gasit[j]){
sol[j] = stramosi[indice[nod[j]] + rang[j]];
gasit[j]++;
}
clear();
}
}
int main(){
int i, s;
freopen("stramosi.in", "rt", stdin);
freopen("stramosi.out", "wt", stdout);
scanf("%d %d", &n, &m);
for(i = 1; i <= n; i++){
scanf("%d", p+i);
nuEFrunza[p[i]] = 1;
}
for(i = 0; i < m; i++)
scanf("%d %d", nod+i, rang+i);
rezolva();
for(i = 0; i < m; i++)
printf("%d\n", sol[i]);
return 0;
}