Pagini recente » Cod sursa (job #103118) | Cod sursa (job #293204) | Cod sursa (job #101557) | Cod sursa (job #1086907) | Cod sursa (job #859260)
Cod sursa(job #859260)
#include <iostream>
#include <fstream>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int n, m, hmax, H[250010], put[35], k;
char ch[10000000];
int a[20][250010];
int tata[250010];
vector <int> G[250010];
inline void DFS(int x)
{
vector <int>::iterator it;
for(it=G[x].begin(); it!=G[x].end(); it++)
{
DFS(*it);
H[*it] = H[x] + 1;
hmax = max(hmax, H[*it]);
}
}
inline void Calc()
{
int i, j;
for(i=1; i<=n; i++)
if (tata[i] == 0)
DFS(i);
for(i=1; i<=n; i++)
a[0][i] = tata[i];
int p = 1;
for(k=1; p<=hmax; k++)
p=p*2;
//cout<<p<<" "<<k;
for(i=1; i<=k; i++)
{
for(j=1; j<=n; j++)
a[i][j] = a[i-1][a[i-1][j]];
}
put[0] = 1;
for(i=1; i<=25; i++)
put[i] = put[i-1]*2;
// cout<<hmax<<"\n";
// for(i=0; i<=k; i++)
// {
// for(j=1; j<=n; j++)
// cout<<a[i][j]<<" ";
// cout<<"\n";
// }
}
inline int Stramos(int q, int p)
{
if (q == 0)
return 0;
if (p == 0)
return q;
int i;
for(i=k; put[i] > p;i--);
// i - exponent, put[i] - puterea
q = a[i][q];
p = p-put[i];
return Stramos(q, p);
}
inline void Solve()
{
ifstream f("stramosi.in");
ofstream g("stramosi.out");
char sir[100];
int i, nr, nrnod;
i = 0, nr = 0;
f.getline(sir, 100);
while(sir[i]!=' ')
nr = nr*10 + (sir[i] - '0'), i++;
n = nr;
nr = 0;
i++;
while(sir[i]<='9' && sir[i]>='0')
nr = nr*10 + (sir[i] - '0'), i++;
m = nr;
f.getline(ch, 10000000);
i = 0;
nrnod = 1;
while(ch[i])
{
nr = 0;
while('0'<=ch[i] && ch[i]<='9' && ch[i])
nr = nr*10 + (ch[i] - '0'), i++;
tata[nrnod] = nr;
if (tata[nrnod]!=0)
G[tata[nrnod]].push_back(i);
nrnod++;
while(ch[i] && ch[i] == ' ')
i++;
}
Calc();
int p, q;
while(m)
{
m--;
f>>q>>p; // care este al p-lea stramos al lui q
if (p>n)
g<<"0\n";
else
g<<Stramos(q, p)<<"\n";
}
f.close();
g.close();
}
int main()
{
Solve();
return 0;
}