Pagini recente » Cod sursa (job #1743520) | Cod sursa (job #2658503) | Cod sursa (job #198991) | Cod sursa (job #2780459) | Cod sursa (job #51237)
Cod sursa(job #51237)
#include <stdio.h>
#include <string.h>
enum { maxn = 250001, maxe = 300001};
int firstbit[maxe];
int n;
int dad[maxn];
bool v[maxn];
int ans[maxn][32]; //powers of 2 (we only need log2(E) < 19)
void precalc_firstbit()
{
int i, bit;
for(i = 0; i < maxe; i++)
{
for(bit = 0; bit < 32 && (1 << bit) <= i; bit++);
firstbit[i] = bit - 1;
}
}
int calc(int node, int rank)
{
if(node == 0 || rank > maxe) return 0;
if(rank == 0) return node;
int bit = firstbit[rank];
return calc( ans[node][bit], rank & (~(1 << bit)) );
}
void precalc(int node)
{
if(v[node]) return;
//terminal case - root
if(dad[node] != 0)
{
if(!v[ dad[node] ]) precalc(dad[node]);
for(int i = 0; i < 31; i++)
ans[node][i] = calc(dad[node], (1 << i) - 1);
}
v[node] = true;
}
int main()
{
int queries, i, who, rank;
FILE *fi = fopen("stramosi.in", "r"),
*fo = fopen("stramosi.out", "w");
if(!fi || !fo) return 1;
fscanf(fi, "%d%d", &n, &queries);
for(i = 1; i <= n; i++)
fscanf(fi, "%d", &dad[i]);
precalc_firstbit();
for(i = 1; i <= n; i++)
precalc(i);
return 1;
for(i = 0; i < queries; i++)
{
fscanf(fi, "%d %d ", &who, &rank);
fprintf(fo, "%d\n", calc(who, rank));
}
fclose(fi);
fclose(fo);
return 0;
}