Pagini recente » Cod sursa (job #2063895) | Cod sursa (job #2891375) | Cod sursa (job #3146385) | Cod sursa (job #2468881) | Cod sursa (job #1426691)
#include <fstream>
#include <list>
#include <string.h>
using namespace std;
ifstream f1("stramosi.in");
ofstream f2("stramosi.out");
#define MX 250010
int n,m, str[MX][20], nr_stram[MX] ;
list<int> graf[MX];
bool viz[MX];
struct stack_node
{
int nod;
list<int>::iterator it;
};
stack_node st[MX];
void DFS() // iterativ
{
int nod, i, k=0;
st[++k].nod= 0;
while (k)
{
nod= st[k].nod;
if ( !viz[nod] )
st[k].it= graf[nod].begin();
else st[k].it++;
viz[nod]= true;
// procesam informatiile despre parintii nodului daca e prima data cand se intra in el
if ( st[k].it == graf[nod].begin() )
{
for (i=1; k- (1<<i) > 0; i++ )
str[nod][i]= st[k- (1<<i) ].nod;
nr_stram[ nod ]= i-1;
}
if ( st[k].it != graf[nod].end() )
{
st[k+1].nod= *st[k].it;
k++;
}
else k--;
}
}
int query(int nod, int p)
{
if ( p > (1<<nr_stram[ nod ]) )
return 0;
if ( p == 0)
return nod;
int i=0;
while ( (1<<(i+1)) <= p )
i++;
return query( str[nod][i], p- (1<<i) );
}
int main()
{
int i, v,q,p;
f1>>n>>m;
for (i=1; i<=n; i++)
{
f1>>v;
str[i][0]= v;
graf[v].push_back(i);
}
DFS();
for (i=1; i<=m; i++)
{
f1>>q>>p;
f2<< query(q, p)<<"\n";
}
f2.close();
return 0;
}