Cod sursa(job #2819797)

Utilizator Ana_22Ana Petcu Ana_22 Data 19 decembrie 2021 02:35:12
Problema Range minimum query Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 0.94 kb
#include <stdio.h>
#include <stdlib.h>
#define NMAX 100000
#define LOGMAX 16

int v[NMAX], llog2[NMAX+1];
int a[NMAX][LOGMAX+1];

int min( int a, int b ) {
  return a < b ? a : b;
}

int main() {
    FILE *fin, *fout;
    int n, m, i, l, x, y, p;
    fin = fopen( "rmq.in", "r" );
    fout = fopen( "rmq.out", "w" );
    fscanf( fin, "%d%d", &n, &m );
    for( i = 0; i < n; i++ ) {
      fscanf( fin, "%d", &v[i] );
      a[i][0] = v[i];
    }
    llog2[1] = 0;
    for( i = 2; i <= n; i++ )
      llog2[i] = llog2[i/2] + 1;
    for( p = 1; p <= LOGMAX; p++ )
      for( i = 0; i + ( 1 << p ) - 1 < n; i++ )
        a[i][p] = min( a[i][p-1], a[i+(1<<(p-1))][p-1] );
    for( i = 0; i < m; i++ ) {
      fscanf( fin, "%d%d", &x, &y );
      x--;
      y--;
      l = y - x + 1;
      fprintf( fout, "%d\n", min( a[x][llog2[l]], a[y-(1<<llog2[l])+1][llog2[l]] ) );
    }
    fclose( fin );
    fclose( fout );
    return 0;
}