Cod sursa(job #568366)

Utilizator Robert29FMI Tilica Robert Robert29 Data 31 martie 2011 09:29:38
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.93 kb
#include<fstream>
#include<vector>
using namespace std;
vector <int> w[250001];
ifstream fi("stramosi.in");
ofstream fo("stramosi.out");
int z,y,i,k,v[250001],a[250001][20],n,m,p,q;
char viz[250001];
void dfs(int x){
	
	viz[x]=1;
	k=0;
	int j=1;
	int y=v[x];

	while(y){
		a[x][++k]=y;
		y=a[y][j++];
	}
	
	for(int i=0;i<w[x].size();++i)
		if(!viz[w[x][i]]){
			
			
			dfs(w[x][i]);
		}
	
}
int main() {
	fi>>n>>m;
	for(i=1;i<=n;++i){
		fi>>v[i];
		w[v[i]].push_back (i);
	}
	
	for(i=1;i<=n;++i)
		if(!v[i]){
			memset(viz,0,sizeof(viz));
			dfs(i);
		}
	
	

	
	for(i=1;i<=m;++i){
		fi>>q>>p;
		int y=q;
		int ok=1;
		while(ok){
			int x=2;
			int k=2;
			if(p==1){
				fo<<v[y]<<'\n';
				break;
			}else if(!p){
				fo<<y<<'\n';
				break;
			}
			while(p>=x){
				x*=x;
				++k;
			}
			x/=2;
			--k;
			y=a[y][k];
			p-=x;
		}
	}
	
	
	
	fo.close();
	fi.close();
	return 0;
}