Cod sursa(job #2804081)

Utilizator andrei_marciucMarciuc Andrei andrei_marciuc Data 20 noiembrie 2021 20:37:19
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <stdio.h>

FILE *fin;

#define min( x, y ) y ^ ( ( x ^ y ) & -( x < y ) )

void swap( int& a, int& b ) {
	int aux = a;
	a = b;
	b = aux;
}

int poz, sizeBuff;
char buff[ ( 1 << 16 ) ];
char nextChar() {
	if( poz == sizeBuff ) {
		fread( buff, 1, sizeBuff, fin );
		poz = 0;
	}

	return buff[ poz++ ];
}

bool type[ 100 ];
int readInt() {
	int rez = 0, ch;
	while( !type[ ch = nextChar() ] );
	do
		rez = rez * 10 + ch - '0';
	while( type[ ch = nextChar() ] );

	return rez;
}

#define MAX 100001
 
int rmq[ 17 ][ MAX ];
int my_log[ MAX ];
int n, q;
 
int main()
{	
	sizeBuff = sizeof( buff );
	type[ '0' ] = type[ '1' ] = type[ '2' ] = type[ '3' ] = type[ '4' ] = 1;
	type[ '5' ] = type[ '6' ] = type[ '7' ] = type[ '8' ] = type[ '9' ] = 1;
	fin = fopen( "rmq.in", "r" );
	fread( buff, 1, sizeBuff, fin );
    n = readInt();
    q = readInt();
   for( int i = 1; i <= n; i++ )
        rmq[ 0 ][ i ] = readInt();
 
    my_log[ 1 ] = 0;
    for( int i = 2; i <= n; i++ )
        my_log[ i ] = my_log[ i >> 1 ] + 1;
 
    for( int i = 1; ( 1 << i ) <= n; i++ )
        for( int j = 1; j + ( 1 << ( i - 1 ) ) <= n; j++ )
            rmq[ i ][ j ] = min( rmq[ i - 1 ][ j ], rmq[ i - 1 ][ j + ( 1 << ( i - 1 ) ) ] );
 
    int a, b;
    FILE *fout = fopen( "rmq.out", "w" );
    while( q-- ) {
        a = readInt();
        b = readInt();
        int x = b - a + 1;
        int Log2 = my_log[ x ];
        fprintf( fout, "%d\n", min( rmq[ Log2 ][ a ], rmq[ Log2 ][ b - ( 1 << Log2 ) + 1 ] ) );
    }
    fclose( fin );
    fclose( fout );
    return 0;
}