Pagini recente » Cod sursa (job #1477456) | Cod sursa (job #1692855) | Cod sursa (job #1826808) | Cod sursa (job #2344957) | Cod sursa (job #999937)
Cod sursa(job #999937)
#include <iostream>
#include <fstream>
using namespace std;
const int Nmax = 100005;
const int LgMax = 18;
int N, M;
int A[Nmax], rmq[LgMax][Nmax], lg[Nmax];
void RMQ()
{
for ( int i = 1; i <= N; ++i )
rmq[0][i] = A[i];
for ( int i = 1; ( 1 << i ) <= N; ++i )
for ( int j = 1; j + ( 1 << i ) - 1 <= N; ++j )
{
int p = 1 << ( i - 1 );
rmq[i][j] = min( rmq[i - 1][j], rmq[i - 1][j + p] );
}
for ( int i = 2; i < Nmax; ++i )
lg[i] = lg[i / 2] + 1;
}
int main()
{
ifstream f("rmq.in");
ofstream g("rmq.out");
f >> N >> M;
for ( int i = 1; i <= N; ++i )
f >> A[i];
RMQ();
for ( int i = 1; i <= M; ++i )
{
int st, dr;
f >> st >> dr;
int diff = dr - st + 1;
int k = lg[diff];
int p = 1 << k;
int sh = diff - p;
g << min ( rmq[k][st], rmq[k][st + sh] ) << "\n";
}
return 0;
}