Cod sursa(job #2323117)

Utilizator Andrei-27Arhire Andrei Andrei-27 Data 18 ianuarie 2019 20:48:58
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.75 kb
#include <bits/stdc++.h>
#define pb push_back
#define sz size()
using namespace std ;
const int NR = 100001 ;
ifstream f ("darb.in") ;
ofstream g ("darb.out") ;
vector < int > v [ NR ] ;
int level [ NR ] , last ;
const int NMAX = 100 ;
const int LOGNMAX  = 11;


    void rmq_sol1 ( int rmq [ NMAX ][ NMAX ] , int v [ NMAX ] , int n )
    {
    int i , j ;
    for ( i = 1 ; i <= n ; ++ i )
    rmq [ i ][ i ] = v  [ i ] ;
    for (  i = 1 ; i < n ; ++ i )
    for ( j = i + 1; j <= n ; ++ j )
    rmq [ i ][ j ] = min ( rmq [ i ][ j - 1 ] , v [ j ] ) ;
    }

    int query_sol1 ( int rmq [ NMAX ][ NMAX ] , int v [ NMAX ] , int n , int a , int b  )
    {
        if ( a > b )    swap ( a , b ) ;
        return rmq [ a ][ b ] ;
    }

    void rmq_sol2 ( int rmq2 [ NMAX ] , int v [ NMAX ] , int n , int k )
    {
       int i , cnt = 0 ;
       for( i = 0 ; i < n ; ++ i )
       {
            if ( !( i % k ) )
                rmq2 [ ++ cnt ] = v [ i ] ;
            else
                rmq2 [ cnt ] = min ( rmq2 [ cnt ] , v[ i ] ) ;
       }
    }


    int query_sol2 ( int rmq2 [ NMAX ] , int v [ NMAX ] , int n , int k , int st , int dr )
    {
        int i , minim = ( 1 << 30 ) , t ;
        for ( i = st ; i % k && i <= dr ; ++ i )   minim = min ( minim , v [ i ] ) ;
        t = i / k ;
        for ( ; i + k - 1 <= dr ; ++ i  )   minim = min ( minim , rmq2 [ t ++ ] ) ;
        for ( ; i <= dr ; ++ i )        minim = min ( minim , v[ i ] ) ;
        return minim ;
    }




    void rmq_sol3 ( int rmq3 [ LOGNMAX ][ NMAX ] , int lg [ NMAX ] , int v [ NMAX ] , int n )
    {
        int i ,j ;
        for ( i = 0 ; i < n ; ++ i )    rmq3 [ 0 ][ i ] = v [ i ] ;

        for ( i = 0 ; ( 1 << i ) <  n ; ++ i )
        for ( j = 0 ; j + ( 1 << i ) <= n ; ++ j )
        rmq3 [ i ][ j ] = min ( rmq3 [ i - 1 ][ j ] , rmq3 [ i - 1 ][ j + ( 1 << i ) ] ) ;

        for ( i = 2 ; i <= n ; ++ i )   lg [ i ] = lg [ i >> 1 ] + 1 ;

    }

    int query_sol3 ( int rmq3 [ LOGNMAX ][ NMAX ] , int lg [ NMAX ] , int a , int b )
    {
        if ( a > b )    swap ( a , b ) ;
        int log = lg [ b - a + 1 ] ;
        return  min ( rmq3 [ log ][ a ] , rmq3 [ log ][ b - ( 1 << log ) + 1 ] ) ;
    }
/*
    void rmq__father ( int rmq_father  )
    {
        int i , j ;
        for (  i = 1 ; i <= n ; ++ i )    rmq_father [ 0 ][ i ] = Father [ i ] ;
        for (  i = 1 ; ( 1 << i ) <= n ; ++ i )
        for (  j = 1 ; j <= n ; ++ j )   rmq_father [ i ][ j ] = rmq_father [ i - 1 ][ rmq_father [ i - 1 ][ j ] ] ;
    }

    int  query_father( int nod , int nr )
    {
        log = lg [ n ] ;
        while ( log -- )  if ( ( 1 << log ) & nr ) nod = rmq [ log ][ nod ] ;
        g << nod << "\n" ;

    }



    void rmq_father__rmq_edge_fun (  )
    {

        for ( int i = 1 ; i <= n ; ++ i )
        {
            rmq_father [ 0 ][ i ] = Father [ i ] ;
            rmq_edge [ 0 ][ i ] = Father_edge [ i ] ;
        }
        for ( int i = 1 ; ( 1 << i ) <= n ; ++ i )
        for ( int j = 1 ; j <= n ; ++ j )
        {
            rmq_father [ i ][ j ] = rmq_father [ i - 1 ][ rmq_father [ i - 1 ][ j ] ] ;
            rmq_edge [ i ][ j ] = min ( rmq_edge [ i - 1 ][ j ] , rmq_edge [ i - 1 ][ rmq_father [ i - 1 ][ j ] ] ) ;
        }

    }

*/
int main ()
{
    int n , q ; f >> n >> q ;
    int v[ NMAX ] = { 0} ;
    int rmq1 [ NMAX ][ NMAX ] = {0} ;
    for ( int i = 1 ; i <=  n ; ++ i )   f >> v[ i ];
    rmq_sol1 ( rmq1 , v , n  ) ;
    while ( q -- )
    {
        int a , b ; f >> a >> b ;
        for ( int i  = min ( a , b ) ; i <= max ( a ,b ) ; ++ i )   cout << v [ i ] << " " ;
        cout << query_sol1 ( rmq1 , v , n  , a   , b  ) << "\n" ;

    }









}