Cod sursa(job #568376)

Utilizator Robert29FMI Tilica Robert Robert29 Data 31 martie 2011 09:41:49
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[20][250001],n,m,p,q;
int b[250001];
void dfs(int x){
	
	a[0][x]=1;
	k=0;
	int j=1;
	int y=v[x];

	while(y){
		a[++k][x]=y;
		y=a[j++][y];
	}
	
	for(int i=0;i<w[x].size();++i)
		if(!a[0][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])
			dfs(i);
		
	
	b[1]=1;
	
	for(i=2;i<=n;++i)
		if(b[i-1]*2==i)
			b[i]=b[i-1]*2;
		else
			b[i]=b[i-1];
	
	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;
			}
			x=b[p];
			y=a[k][y];
			p-=x;
		}
	}
	
	
	
	fo.close();
	fi.close();
	return 0;
}