Cod sursa(job #65064)

Utilizator bogdanzZaharia Bogdan bogdanz Data 6 iunie 2007 21:26:50
Problema Stramosi Scor 70
Compilator c Status done
Runda Arhiva de probleme Marime 1.03 kb
#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;
}