Cod sursa(job #3240895)

Utilizator RaresHRares Hanganu RaresH Data 22 august 2024 21:37:46
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.88 kb
#include <stdio.h>

const int MAXN = 250'000;
const int MAX_LOG = 18;

int parent[MAXN + 1];
int dp[MAX_LOG + 1][MAXN + 1];

int main() {
  FILE *fin, *fout;
  int n, m, i, j, q, p, bit;

  fin = fopen("stramosi.in", "r");
  fscanf(fin, "%d%d", &n, &m);
  for(i = 1; i <= n; i++) {
    fscanf(fin, "%d", &parent[i]);
  }

  for(i = 1; i <= n; i++) {
    dp[0][i] = parent[i];
  }
  for(i = 1; i <= MAX_LOG; i++) {
    for(j = 1; j <= n; j++) {
      // vrem sa avansam o data cu 2^j, asa ca avansam de 2 ori cu 2^(j-1)
      dp[i][j] = dp[i - 1][dp[i - 1][j]];
    }
  }

  fout = fopen("stramosi.out", "w");
  for(i = 0; i < m; i++) {
    fscanf(fin, "%d%d", &q, &p);

    // vrem p pozitii in fata pentru q
    bit = 0;
    while(p > 0) {
      if(p & 1) {
        q = dp[bit][q];
      }
      bit++;
      p >>= 1;
    }

    fprintf(fout, "%d\n", q);
  }
  fclose(fout);
  fclose(fin);

  return 0;
}