Cod sursa(job #2568441)

Utilizator gogu5Gogu Vrea la ONI gogu5 Data 3 martie 2020 22:53:57
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.97 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 ( i = 1; i <= n; i++ )
        for ( j = 1; j <= l[i]; j++ )
            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 = l[y - x + 1];
    return mn( r[y][len], r[x + ( 1 << len ) - 1][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 = 1; i <= n; i++ )
        fscanf( fin, "%d", &r[i][0] );
    lg( n );
    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;
}