Cod sursa(job #2568404)

Utilizator gogu5Gogu Vrea la ONI gogu5 Data 3 martie 2020 22:35:48
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.02 kb
#include <bits/stdc++.h>

int r[100000][17];
int l[100000];

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

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

void lg( int n ) {
    int i;
    for ( i = 2; i <= n; i++ )
        l[i] = l[i / 2] + 1;
}

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

int main() {
    FILE *fin, *fout;
    int n, m, i, x, y;
    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", &r[i][0] );
    rmq( n );
    for ( i = 0; i < m; i++ ) {
        fscanf( fin, "%d%d", &x, &y );
        fprintf( fout, "%d\n", query( x - 1, y - 1 ) );
    }
    fclose( fin );
    fclose( fout );
    return 0;
}