Pagini recente » Cod sursa (job #720250) | Cod sursa (job #1697879) | Cod sursa (job #1366098) | Cod sursa (job #1444407) | Cod sursa (job #1438909)
#include<fstream>
#include<vector>
using namespace std;
ifstream f("stramosi.in");
ofstream g("stramosi.out");
int m,n,p,q;
bool viz[250004];
vector<int> a[250004],fii[250004], s,rad;
void df(int nod)
{
int l=s.size(),p=1;
s.push_back(nod);
while((l-p)>=0)
{
a[nod].push_back(s[l-p]);
p*=2;
}
l=fii[nod].size();
for(int i=0;i<l;i++)
df(fii[nod][i]);
s.pop_back();
}
int stramos(int p, int q)
{
int e=0;
while(p&&e<a[q].size())
{
if(p%2)
{
q=a[q][e];
}
e++;
p=p/2;
}
if(p!=0)
return 0;
return q;
}
/*int stramos(int p, int q)
{
int e=0;
while(p)
{
if((1<<e)>p)
{
if(e<=a[q].size())
{
q=a[q][e-1];
e=0;
p=p-(1<<(e-1));
}
else break;
}
else
e++;
}
if(p)
return 0;
else
return q;
}*/
int main()
{
f>>n>>m;
for(int i=1;i<=n;i++)
{
int x;
f>>x;
if(!x)
rad.push_back(i);
else
fii[x].push_back(i);
}
int l=rad.size();
for(int i=0;i<l;i++)
df(rad[i]);
for(int i=0;i<m;i++)
{
f>>q>>p;
g<<stramos(p,q)<<"\n";
}
f.close();g.close();
return 0;
}