Pagini recente » Cod sursa (job #774155) | Cod sursa (job #810566) | Cod sursa (job #2334021) | Cod sursa (job #1685761) | Cod sursa (job #2376257)
#include <bits/stdc++.h>
#define N 100005
using namespace std;
ifstream fin( "rmq.in" );
ofstream fout( "rmq.out" );
int n, nrq;
int v[N];
int d[30][N];
int lg[N];
void rmq_gen()
{
int i, j;
int a, b;
lg[2] = 1;
for ( i = 3; i <= n; ++i )
lg[i] = lg[i/2] + 1;
for ( i = 1; i <= n; ++i )
d[0][i] = i;
for ( i = 1; ( 1 << i ) <= n; ++i )
for ( j = 1; j + ( 1 << i ) - 1 <= n; ++j )
{
a = d[ i - 1 ][ j ];
b = d[ i - 1 ][ j + ( 1 << ( i - 1 ) ) ];
if ( v[a] < v[b] ) d[i][j] = a;
else d[i][j] = b;
}
}
int rmq( int x, int y )
{
if ( x > y ) swap( x, y );
int range = y - x + 1;
int k = lg[range];
return min( v[ d[k][x] ], v[ d[k][ y - ( 1 << k ) + 1 ] ] );
}
void read()
{
int i, x, y;
fin >> n >> nrq;
for ( i = 1; i <= n; ++i )
fin >> v[i];
rmq_gen();
for ( i = 1; i <= nrq; ++i )
{
fin >> x >> y;
fout << rmq( x , y ) << '\n';
}
fin.close();
}
int main()
{
read();
fout.close();
return 0;
}