Pagini recente » Cod sursa (job #591792) | Cod sursa (job #1435009) | Cod sursa (job #1754743) | Cod sursa (job #2353387) | Cod sursa (job #2367043)
#include <iostream>
#include <fstream>
const char* IN_FILE_NAME = "stramosi.in";
const char* OUT_FILE_NAME = "stramosi.out";
using namespace std;
// Problem link: https://www.infoarena.ro/problema/stramosi
// Diff: ***
const int MAX_N = 250000 + 10; // Inca 10 de la baiatu'
const int MAX_M = 350000 + 10;
const int MAX_LEVELS = 19;
typedef int ancsT[MAX_N][MAX_LEVELS];
ancsT gAncs;
void ReadFirstLevel(ifstream& In, int N)
{
for (int i = 1; i <= N; ++i)
//In >> gAncs[i][0];
In >> gAncs[0][i];
}
void CompleteRemainingLevels(int N)
{
for (int j = 1; j < MAX_LEVELS; ++j)
for (int i = 0; i <= N; ++i)
//gAncs[i][j] = gAncs[gAncs[i][j - 1]][j - 1];
gAncs[j][i] = gAncs[j - 1][gAncs[i][j - 1]];
}
void ResolveQueries(ifstream& In, ofstream& Out, int N, int M)
{
int q, p;
for (int m = 0; m < M; ++m)
{
In >> q;
In >> p;
int anc = q;
for (int level = 0; (p > 0) && (anc != 0); p >>= 1, ++level)
{
if ((p & 1) == 0)
continue;
//anc = gAncs[anc][level];
anc = gAncs[level][anc];
}
Out << anc << "\n";
}
}
int main(int argc, char*argv[])
{
ifstream inF{ IN_FILE_NAME };
ofstream outF{ OUT_FILE_NAME };
int n, m;
inF >> n;
inF >> m;
ReadFirstLevel(inF, n);
CompleteRemainingLevels(n);
ResolveQueries(inF, outF, n, m);
return 0;
}