Pagini recente » Info Oltenia 2019 Proba pe Echipe Clasele 9 - 10 | Cod sursa (job #1381864) | Cod sursa (job #1347584) | Cod sursa (job #843414) | Cod sursa (job #2022956)
#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[22][N], vis[N], power, ind, 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, ind = 1;
while(power <= nr)
{
v[ind][k] = st[nr - power + 1];
power = power * 2;
ind++;
}
}
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);
G[i].push_back(father[i]);
}
}
for (i = 1; i <= n; i++)
if (vis[i] == 0)
{
DFS(i);
nr = 0;
}
for (i = 1; i <= m; i++)
{
fscanf(f1, "%d%d", &q, &p);
power = 1; ind = 1;
while(power <= p)
{
ind++;
power = power * 2;
}
ind--;
power = power / 2;
ind = v[ind][q];
res = ind;
while (ind != 0 && power <= p)
{
power++;
res = ind;
ind = father[ind];
}
fprintf(f2, "%d\n", res);
}
fclose(f1);
fclose(f2);
return 0;
}