Cod sursa(job #2323118)

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


int cnt ;

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

    int query_sol2 ( int rmq [ SQRTNMAX ] , int v [ NMAX ] , int n , int k , int st , int dr )
    {
        int i , minim = ( 1 << 30 ) , t ;
        for ( i = st ; ( i - 1 ) % k && i <= dr ; ++ i )   minim = min ( minim , v [ i ] ) ;
        // elementele dinaintea primei secvente complete
        t = i / k + 1 ; // indexul secventei actuale
        for ( ; i + k - 1 <= dr ; i += k  )   minim = min ( minim , rmq [ t ++ ] ) ;
        // fiecare secventa din interval
        for ( ; i <= dr ; ++ i )        minim = min ( minim , v[ i ] ) ;
        // elementele de dupa ultima secventa completa
        return minim ;
    }



int main ()
{
    int n , q ; f >> n >> q ;
    int v[ NMAX ] = { 0} ;
    int rmq2 [ SQRTNMAX ] = {0} ;
    for ( int i = 1 ; i <=  n ; ++ i )   f >> v[ i ];
    int k = sqrt( n ) ; //cout << k;
    rmq_sol2 ( rmq2 , v , n , k ) ;
    while ( q -- )
    {
        int a , b ; f >> a >> b ;
        g << query_sol2 ( rmq2 , v , n , k , a   , b  ) << "\n" ;

    }
}