Pagini recente » Cod sursa (job #150965) | Cod sursa (job #1619762) | Cod sursa (job #1420826) | Cod sursa (job #544759) | Cod sursa (job #988924)
Cod sursa(job #988924)
#include <cstdio>
#include <vector>
#include <bitset>
using namespace std;
#define MAXN 250005
#define BIT_MAX 32
typedef vector<int>::iterator iter;
//<parsare>
FILE* fin=fopen("stramosi.in","r");
const unsigned maxb=8192;
char buf[maxb];
unsigned ptr=maxb;
inline int getInt(){
int nr=0,mul=1;
while(buf[ptr]<'0'||'9'<buf[ptr]||buf[ptr]=='-'){
if(buf[ptr]=='-'){
mul=-1;
}
if(++ptr>=maxb)
fread(buf,maxb,1,fin),ptr=0;
}
while('0'<=buf[ptr]&&buf[ptr]<='9'){
nr=nr*10+buf[ptr]-'0';
if(++ptr>=maxb)
fread(buf,maxb,1,fin),ptr=0;
}
return nr*mul;
}
//</parsare>
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* fout=fopen("stramosi.out","w");
n = getInt();
m = getInt();
for(int i=1,t;i<=n;i++){
t = getInt();
arb[t].push_back(i);
}
dfs(0);
for(int i=1,nod,k;i<=m;i++){
nod = getInt();
k = getInt();
fprintf(fout,"%d\n",query(nod,k));
}
fclose(fin);
fclose(fout);
return 0;
}