Pagini recente » Cod sursa (job #3217713) | Cod sursa (job #1793663) | Cod sursa (job #707331) | Cod sursa (job #2322643) | Cod sursa (job #2022933)
#include <bits/stdc++.h>
#define N 250001
#define M 300001
using namespace std;
FILE *f1 = fopen("stramosi.in", "r");
FILE *f2 = fopen("stramosi.out", "w");
int st[N], nr, n, m, i, a, p, q, father[N], v[18][N], vis[N], power, index, res;
vector<int> G[N];
void DFS(int k)
{
vis[k] = 1;
nr++;
st[nr] = k;
int i;
for (i = 0; i < G[k].size(); i++)
if (vis[G[k][i]] == 0)
DFS(G[k][i]);
nr--;
int power = 1, index = 1;
while(power <= nr)
{
v[index][k] = st[nr - power + 1];
power = power * 2;
index++;
}
}
int main()
{
fscanf(f1, "%d%d", &n, &m);
for (i = 1; i <= n; i++)
{
fscanf(f1, "%d", &father[i]);
if (father[i] != 0)
G[father[i]].push_back(i);
}
for (i = 1; i <= n; i++)
if (father[i] == 0)
{
DFS(i);
nr = 0;
}
for (i = 1; i <= m; i++)
{
fscanf(f1, "%d%d", &q, &p);
power = 1; index = 1;
while(power <= p)
{
index++;
power = power * 2;
}
index--;
power = power / 2;
index = v[index][q];
res = index;
while (index != 0 && power <= p)
{
power++;
res = index;
index = father[index];
}
fprintf(f2, "%d\n", res);
}
fclose(f1);
fclose(f2);
return 0;
}