Pagini recente » Cod sursa (job #354541) | Cod sursa (job #2156281) | Cod sursa (job #1365418) | Cod sursa (job #1345273) | Cod sursa (job #1427000)
#include <fstream>
#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], val[MX], next[MX], first[MX], last[MX], nrn ;
bool viz[MX];
void add_edge(int x, int y)
{
if ( !first[x] )
first[x]= nrn+1;
next[ last[x] ]= ++nrn;
val[nrn]= y;
last[x]= nrn;
}
struct stack_node
{
int nod, 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= first[ nod ];
else st[k].it= next[ st[k].it ];
viz[nod]= true;
// procesam informatiile despre parintii nodului daca e prima data cand se intra in el
if ( st[k].it == first[nod] )
{
for (i=1; k- (1<<i) > 1; i++ )
str[nod][i]= st[k- (1<<i) ].nod;
nr_stram[ nod ]= k-2;
}
if ( st[k].it )
{
st[k+1].nod= st[k].it;
k++;
}
else k--;
}
}
int query(int nod, int p)
{
if ( p > 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;
add_edge(v,i);
}
DFS();
for (i=1; i<=m; i++)
{
f1>>q>>p;
f2<< query(q, p)<<"\n";
}
f2.close();
return 0;
}