Cod sursa(job #2777803)

Utilizator andreic06Andrei Calota andreic06 Data 24 septembrie 2021 19:37:58
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <iostream>
#include <cstdio>

using namespace std;

const int NMAX = 100001;
int A[NMAX], M[NMAX][17];
int lg2[NMAX];


int main()
{

   freopen ( "rmq.in", "r", stdin );
   freopen ( "rmq.out", "w", stdout );

   int n, m;
   int i, j;
   int st, dr;
   int lg;

   scanf ( "%d%d", &n, &m );

   for ( i = 1; i <= n; i ++ )
      scanf ( "%d", &A[i] );
   for ( i = 1; i <= n; i ++ )
      M[i][0] = i; /// pentru lungime 1
   for ( i = 2; i <= n; i ++ )
      lg2[i] = 1 + lg2[i >> 1];

   for ( j = 1; 1 << j <= n; j ++ ){
      for ( i = 1; i + ( 1 << j ) - 1 <= n; i ++ )
         if ( A[M[i][j-1]] < A[M[i + ( 1 << ( j - 1 ) ) ][j - 1]] ) /// comparam pratic cele 2 jumatati ale inetervalului actual
           M[i][j] = M[i][j-1];
         else
           M[i][j] = M[i + ( 1 << ( j - 1 ) )][j - 1];
   }

   for ( i = 1; i <= m; i ++ ){
      scanf ( "%d%d", &st, &dr );

      lg = lg2[dr-st+1];
      if ( A[M[st][lg]] <= A[M[dr - ( 1 << lg ) + 1][lg]] )
        printf ( "%d\n", A[M[st][lg]] );
      else
        printf ( "%d\n", A[M[dr - ( 1 << lg ) + 1][lg]] );
   }

    return 0;
}