Cod sursa(job #774235)

Utilizator starduststardust stardust Data 3 august 2012 20:41:50
Problema Stramosi Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include<vector>
#include<fstream>
#include<stack>
#include<queue>
#define maxn 500010
#define pb push_back
using namespace std;
 
bool uz[maxn];
vector<int>a[maxn];
vector<int>query[maxn];
vector<int>ans[maxn];
vector<int>tati;
stack< pair<int,int> > q;
pair<int, int> aux;
int st[maxn],cnt[maxn];
int vec[maxn];
ifstream in("stramosi.in");
ofstream out("stramosi.out");

int n,m;

void read()
{
	in>>n>>m;
	int x,y;
	for(int i=1;i<=n;i++)
	{
		in>>x;
		if(x>0)
		a[x].pb(i);
		else tati.pb(i);
	}
	for(int i=1;i<=m;i++)
	{
		in>>x>>y;
		query[x].pb(y);
		vec[i]=x;
	}
}

void dfs(int nod)
{
	int niv=1;
    q.push(make_pair(nod,1));
	while(!q.empty())
	{
	  aux=q.top();
	  nod=aux.first;
	  niv=aux.second;
	  st[niv]=nod;
	  uz[nod]=1;
	for(int i=0;i<query[nod].size();i++)
	{
		if(niv-query[nod][i]>0) ans[nod].pb(st[niv-query[nod][i]]);
		else ans[nod].pb(0);
	}
	int ok=1;
	for(int i=0;i<a[nod].size();i++)
		if(uz[a[nod][i]]==0)
		{
			ok=0;
			aux.first=a[nod][i];
			aux.second=niv+1;
			q.push(aux);
			break;
		}
		if(ok==1) q.pop();
	}
}

int main()
{
	read();
	for(int i=0;i<tati.size();i++)
		dfs(tati[i]);
	
	for(int i=1;i<=m;i++)
	{
		int x=vec[i];
		out<<ans[x][cnt[x]]<<"\n";
		cnt[x]++;
	}
}