Pagini recente » Cod sursa (job #2242715) | Cod sursa (job #2176373) | Cod sursa (job #2921794) | Cod sursa (job #2582695) | Cod sursa (job #988915)
Cod sursa(job #988915)
#include <cstdio>
#include <vector>
#include <bitset>
using namespace std;
#define MAXN 250005
#define BIT_MAX 32
typedef vector<int>::iterator iter;
vector<int> arb[MAXN];
int par[BIT_MAX][MAXN],stk[MAXN],sp=0,n,m;
void dfs(int nod)
{
for(int i=1,cnt=0; cnt<BIT_MAX,i<=sp; i<<=1,cnt++) {
par[cnt][nod]=stk[sp-i];
}
stk[sp++]=nod;
for(iter it=arb[nod].begin(); it!=arb[nod].end(); it++) {
dfs(*it);
}
sp--;
}
int query(int nod,int k)
{
int lst=nod,b=0;
do {
if(k&1) {
lst=par[b][lst];
}
b++,k>>=1;
} while(k && lst);
return lst;
}
int main()
{
FILE* fin=fopen("stramosi.in","r");
FILE* fout=fopen("stramosi.out","w");
fscanf(fin,"%d %d\n",&n,&m);
for(int i=1,t; i<=n; i++) {
fscanf(fin,"%d ",&t);
arb[t].push_back(i);
}
dfs(0);
for(int i=1,nod,k; i<=m; i++) {
fscanf(fin,"%d %d\n",&nod,&k);
fprintf(fout,"%d\n",query(nod,k));
}
fclose(fin);
fclose(fout);
return 0;
}