Pagini recente » Rezultatele filtrării | Cod sursa (job #450365) | Rezultatele filtrării | Rezultatele filtrării | Cod sursa (job #3196800)
// https://www.infoarena.ro/problema/stramosi
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
int table[250001][20];
int parent[250001];
vector<int> adj[250001];
void DFS(int source){
cerr << source << ' ';
for(auto i : adj[source]){
table[i][0] = source;
for(int k = 1; k < 20; k ++)
table[i][k] = table[table[i][k - 1]][k - 1];
DFS(i);
}
}
int query(int p, int q){
// cerr << p << ' ' << q << '\n';
if(p == 0)
return 0;
if(q == 0)
return p;
int k = log2(q);
return query(table[p][k], q - (1 << k));
}
// ifstream fin("input.txt");
// ofstream fout("output.txt");
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
int main(){
int n, q, P, Q, val;
fin >> n >> q;
for(int i = 1; i <= n; i ++){
fin >> val;
adj[val].push_back(i);
parent[i] = val;
}
// BUILD
for(int i = 1; i <= n; i ++)
if(!parent[i])
DFS(i);
for(int i = 1; i <= q; i ++){
fin >> P >> Q;
fout << query(P, Q) << '\n';
}
// for(int i = 1; i <= n; i ++)
// for(int j = 0; j <= 3; j ++)
// cerr << table[i][j] << " \n"[j == 3];
return 0;
}