Pagini recente » Cod sursa (job #1683600) | Statistici Rusz Elisabeta (erzsike) | Cod sursa (job #1774464) | Cod sursa (job #227967) | Cod sursa (job #2007661)
#include <bits/stdc++.h>
using namespace std;
vector<int> fii[250005];
int n, t, m[250005][20], tt[250005];
bool ok[250005];
void df(int x)
{
ok[x] = 1;
m[x][0] = tt[x];
int k = 0;
while(m[m[x][k]][k] != 0){
m[x][k+1] = m[m[x][k]][k];
++k;
}
for (vector<int>::iterator it = fii[x].begin(); it != fii[x].end(); ++it)
if(!ok[*it])
df(*it);
}
int pw2(int x)
{
int p = 1, i;
for (i = 0; p <= x; ++i)
p *= 2;
return i-1;
}
int main()
{
ifstream fin ("stramosi.in");
ofstream fout ("stramosi.out");
fin >> n >> t;
for (int i = 1; i <= n; ++i){
int x;
fin >> x;
fii[x].push_back(i);
tt[i] = x;
}
for (vector<int>::iterator nepot = fii[0].begin(); nepot != fii[0].end(); ++nepot){
for (vector<int>::iterator it = fii[*nepot].begin(); it != fii[*nepot].end(); ++it)
df(*it);
}
while(t--){
int x, y;
fin >> x >> y;
while(y){
int p = pw2(y);
y -= (1<<p);
x = m[x][p];
}
fout << x << "\n";
}
fin.close();
fout.close();
return 0;
}