Cod sursa(job #820457)

Utilizator lucian666Vasilut Lucian lucian666 Data 20 noiembrie 2012 21:30:17
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb


//Vasilut
#include<fstream>
#include<cmath>

#define NN 100001
#define LOGN 19

using namespace std;
ofstream out("rmq.out");
ifstream in("rmq.in");

int a[NN][LOGN],n,m;

void read();
void RMQ();
void write_sol();

int main()
{
    read();
    RMQ();
    write_sol();
    return 0;
}


void read()
{

    in>>n>>m;
    for(int i=1;i<=n;i++)
        in>>a[i][0];
}

void RMQ()
{
    int k=0;// lung de interval a[i][j] intervalul care porneste de la poz i si are lungimea ( 1 << j )

    while ( ( 1 << k ) <=n )
        ++k;
        --k;
        int i,j;
            for(j=1;j<=k;j++)
                for(i=1;i<=n;i++)
                {
                    a[i][j]=a[i][j-1];
                        if ( i + ( 1 << ( j - 1 ) ) <=n )
                            a[i][j] = min ( a[i][j] ,a[ i + (1 << (j - 1 ) ) ] [j-1]  );
                }
}


void write_sol()
{
    for(int x,y ;m ;--m)
    {
        in>>x>>y;
            if ( x == y )
                out<<a[x][0]<<" "<<'\n';
                else
                    {
                        int k=floor( log( y -x ) / log ( 2 ) ) ;
                            out<<min ( a[x][k] , a[ y - (1 << k ) +1 ] [k] ) <<'\n';
                    }
    }
}