Pagini recente » Monitorul de evaluare | Monitorul de evaluare | Atasamentele paginii Clasament mlindulmropta | Monitorul de evaluare | Cod sursa (job #436701)
Cod sursa(job #436701)
/*
* File: main.cpp
* Author: VirtualDemon
*
* Created on April 8, 2010, 7:58 PM
*/
#include <cstdlib>
#include <fstream>
#include <algorithm>
#define Nmax 400100
#define oo 0x3f3f3f3f
/*
*
*/
using namespace std;
int Aint[Nmax];
int P, x, a, b;
inline const int& min( const int& x, const int& y )
{
if( x < y )
return x;
return y;
}
inline void UpDate( int vertex, int left, int right )
{
if( left == right )
{
Aint[vertex]=x;
return;
}
int middle=left+(right-left)/2, p=vertex<<1, y=oo;
if( P <= middle )
UpDate( p, left, middle );
else UpDate( p+1, middle+1, right );
Aint[vertex]=min( Aint[p], Aint[p+1] );
}
inline int Query( int vertex, int left, int right )
{
if( a <= left && right <= b )
return Aint[vertex];
int p=vertex<<1, middle=left+(right-left)/2, minim=oo;
if( a <= middle )
minim=Query( p, left, middle );
if( b > middle )
minim=min( minim, Query( p+1, middle+1, right ) );
return minim;
}
int main(int argc, char** argv)
{
int N, M;
ifstream in( "rmq.in" );
in>>N>>M;
fill( Aint, Aint+4*N+1, oo );
for( P=1; P <= N; ++P )
{
in>>x;
UpDate( 1, 1, N );
}
ofstream out( "rmq.out" );
for( ; M; --M )
{
in>>a>>b;
out<<Query( 1, 1, N )<<'\n';
}
return EXIT_SUCCESS;
}