Cod sursa(job #2759241)

Utilizator LucaMihaiLM10Luca Ilie LucaMihaiLM10 Data 16 iunie 2021 12:24:50
Problema Range minimum query Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <stdio.h>

#define MAX_N 100000
#define MAX_LG2N 16

int v[MAX_N], rmq[MAX_N][MAX_LG2N + 1], lg2[MAX_N + 1];

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

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

    fin = fopen( "rmq.in", "r" );

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

    for ( i = n - 1; i >= 0; i-- ) {
        rmq[i][0] = v[i];
        p = 2;
        for ( j = 1; i + p - 1 < n; j++ ) {
            rmq[i][j] = min( rmq[i][j - 1], rmq[i + (p >> 1)][j - 1] );
            p <<= 1;
        }
    }

    for ( i = 1; i <= n; i++ )
        lg2[i] = (1 << (lg2[i - 1] + 1)) == i ? lg2[i - 1] + 1 : lg2[i - 1];

    fout = fopen( "rmq.out", "w" );

    for ( i = 0; i < q; i++ ) {
        fscanf( fin, "%d%d", &l, &r );
        l--;
        r--;
        j = lg2[r - l + 1];
        p = 1 << j;
        fprintf( fout, "%d\n", min( rmq[l][j], rmq[r - p + 1][j] ) );
    }

    fclose( fin );
    fclose( fout );

    return 0;
}