Cod sursa(job #834683)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 14 decembrie 2012 22:13:51
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include<fstream>
#include<vector>
#include<algorithm>
#define DIM 250010

using namespace std;

ifstream f("stramosi.in");
ofstream g("stramosi.out");

vector<int> L[DIM];

int D[DIM],n,m,a,nr,i,k;
int stack[DIM];

struct q{
	int nod;
	int s;
	int sol;
	int i;
}V[DIM+50000];

int cautare(int x){
	int st=1;
	int dr=m;
	int mid=(st+dr)/2;
	int sol=0;
	while(st<=dr){
		if(V[mid].nod==x)
			sol=mid;
		if(V[mid].nod>x)
			dr=mid-1;
		else
			st=mid+1;
		mid=(st+dr)/2;
	}
	return sol;
}

void dfs(int x){
	stack[++nr]=x;
	int poz=cautare(x);
	int i=poz;
	while(V[i].nod==V[poz].nod){
		if(V[i].s!=0&&V[i].s<=nr)
			V[i].sol=stack[nr-V[i].s];
		i++;
	}
	
	for(i=0;i<L[x].size();i++){
		dfs(L[x][i]);
		nr--;
	}
	
}

int cmp(q a ,q b){
	if(a.nod>b.nod)
		return 0;
	else if(a.nod==b.nod&&a.s>b.s)
		return 0;
	return 1;
}

int cmp1(q a , q b){
	if(a.i>b.i)
		return 0;
	return 1;
}

int main(){
	
	f>>n>>m;
	
	for(i=1;i<=n;i++){
		f>>a;
		if(a!=0)
			L[a].push_back(i);
		else 
			D[++k]=i;
	}
	
	for(i=1;i<=m;i++){
		f>>V[i].nod>>V[i].s;
		V[i].i=i;
	}
	
	sort(V+1,V+m+1,cmp);
	
	for(i=1;i<=k;i++){
		dfs(D[i]);
		nr--;
	}
	
	sort(V+1,V+m+1,cmp1);
	
	for(i=1;i<=m;i++)
		g<<V[i].sol<<"\n";
	
	return 0;
}