Mai intai trebuie sa te autentifici.
Cod sursa(job #2539184)
Utilizator | Data | 5 februarie 2020 18:49:42 | |
---|---|---|---|
Problema | Stramosi | Scor | 90 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva de probleme | Marime | 1 kb |
#include <fstream>
#include <iostream>
#define MAX 250000
#define LOG 20
using namespace std;
int dad[MAX + 5];
int dp[MAX + 5][LOG];
void precalculare(int n)
{
for(int nod = 1; nod <= n; nod++)
dp[nod][0] = dad[nod];
for(int i = 1; i < LOG; i++)
for(int nod = 1; nod <= n; nod++)
dp[nod][i] = dp[dp[nod][i - 1]][i - 1];
}
int query(int q, int p)
{
int sol = q;
for(int i = LOG - 1; i >= 0; i--)
{
if(p >= (1 << i))
{
p -= (1 << i);
sol = dp[sol][i];
}
}
return sol;
}
int main()
{
int n, m;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
fin >> n >> m;
for(int i = 1; i <= n; i++)
fin >> dad[i];
precalculare(n);
for(int i = 1; i <= m; i++)
{
int q, p;
fin >> q >> p;
fout << query(q, p) << '\n';
}
fin.close();
fout.close();
return 0;
}