Cod sursa(job #2377087)

Utilizator priboiraduPriboi Radu Bogdan priboiradu Data 8 martie 2019 21:35:07
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <bits/stdc++.h>
#define INFINIT 1000000000

int lg[100001];

void log() {
    int i;
    lg[1] = 0;
    for ( i = 2; i <= 100000; i++ )
        lg[i] = lg[i / 2] + 1;
}

int v[100001];
int r[100001][17];

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

void rmq( int n ) {
    int i, j;
    for ( i = 1; i <= n; i++ ) {
        r[i][0] = v[i];
        for ( j = 1; j <= lg[i]; j++ ) {
            r[i][j] = mn( r[i][j - 1], r[i - ( 1 << ( j - 1 ) )][j - 1] );
        }
    }
}

int query( int x, int y ) {
    int l = lg[y - x + 1];
    return mn( r[y][l], r[x + ( 1 << l ) - 1][l] );
}

int main() {
    FILE *fin, *fout;
    int n, m, i, x, y;
    fin = fopen( "rmq.in", "r" );
    fout = fopen( "rmq.out", "w" );
    log();
    fscanf( fin, "%d%d", &n, &m );
    for ( i = 1; i <= n; i++ )
        fscanf( fin, "%d", &v[i] );
    rmq( n );
    for ( i = 0; i < m; i++ ) {
        fscanf( fin, "%d%d", &x, &y );
        fprintf( fout, "%d\n", query( x, y ) );
    }
    fclose( fin );
    fclose( fout );
    return 0;
}