Cod sursa(job #640794)

Utilizator mlupseLupse-Turpan Mircea mlupse Data 26 noiembrie 2011 15:21:05
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
using namespace std;
#include <cstdio>
#include <vector>
#define DIM 8192
#define maxn 300001
vector < int > G[250001];
vector < pair<int, int > > Q[250001];
char ax[DIM+16];
int pz;

inline void cit(int &x)
{
	x=0;
	while(ax[pz]<'0' || ax[pz]>'9')
		if(++pz==DIM)fread(ax, 1, DIM, stdin), pz=0;
	while(ax[pz]>='0' && ax[pz]<='9')
	{
		x=x*10+ax[pz]-'0';
		if(++pz==DIM)fread(ax,1, DIM, stdin),pz=0;
	}
}

int n,m;
bool use[250001];
int TT[250001];
int sol[300001];
int st[250001];

void read()
{
	int i,p,q;
	freopen("stramosi.in","r",stdin);
	//scanf("%d %d\n",&n, &m);
	cit(n);cit(m);
	
	for(i=1;i<=n;++i) 
	{
		//scanf("%d ", &p);
		cit(p);
		TT[i]=p;
		G[p].push_back(i);
	}
	
	
	for(i=1;i<=m;++i)
	{
		//scanf("%d %d\n", &p,&q);
		cit(p);cit(q);
		Q[p].push_back( make_pair(q,i));
	}
}

inline void dfs(int n, int k)
{
	use[n]=1;
	st[k]=n;
	
	for(unsigned int i = 0; i<Q[n].size(); i++)
		if(k >= Q[n][i].first)
			sol[Q[n][1].second]=st[k-Q[n][i].first];
		
	for(vector <int>::iterator it=G[n].begin(); it!=G[n].end(); it++)
		if(!use[*it])
			dfs(*it,k+1);
}

void solve()
{int i;
	freopen("stramosi.out","w",stdout);
	for(i=1;i<=n;++i)
		if(!TT[i]) 
			dfs(i, 0);
	for(i=1;i<=m;++i)printf("%d\n", sol[i]);
}

int main()
{
	read();
	solve();
	return 0;
}