Pagini recente » Cod sursa (job #409165) | Cod sursa (job #2493018) | Cod sursa (job #1885641) | Cod sursa (job #1358729) | Cod sursa (job #834682)
Cod sursa(job #834682)
#include<fstream>
#include<vector>
#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;
}