Cod sursa(job #2452056)

Utilizator mircea_007Mircea Rebengiuc mircea_007 Data 29 august 2019 13:26:23
Problema Range minimum query Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.03 kb
#include <stdio.h>

#define MAX_N 1000000
#define MAXLN 19

int num[MAX_N];
int minPoz[MAX_N][MAXLN + 1];

int Log( int n ){
  int logn;

  logn = MAXLN;
  while( 1 << logn > n )
    logn--;

  return logn;
}

int main(){
  FILE *fin  = fopen("rmq.in",  "r");
  FILE *fout = fopen("rmq.out", "w");

  int n, num_q, i, l, logn, x, y, len;

  fscanf(fin, "%d%d", &n, &num_q);
  for( i = 0 ; i < n ; i++ )
    fscanf(fin, "%d", &num[i]);

  logn = Log(n);

  for( l = 0 ; l <= logn ; l++ )
    for( i = 0 ; i < n - (1 << l) + 1 ; i++ )
      minPoz[i][l] = l == 0 ? i : num[minPoz[i][l - 1]] < num[minPoz[i + (1 << (l - 1))][l - 1]] ? minPoz[i][l - 1] : minPoz[i + (1 << (l - 1))][l - 1];

  for( i = 0 ; i < num_q ; i++ ){
    fscanf(fin, "%d%d", &x, &y);
    x--;
    y--;

    len = y - x + 1;
    l = Log(len);
    fprintf(fout, "%d\n", num[minPoz[x][l]] < num[minPoz[x + len - (1 << l)][l]] ? num[minPoz[x][l]] : num[minPoz[x + len - (1 << l)][l]]);
  }

  fclose(fin);
  fclose(fout);
  return 0;
}