Pagini recente » Cod sursa (job #1284929) | Cod sursa (job #2543049) | Cod sursa (job #2889841) | Cod sursa (job #2581436) | Cod sursa (job #2767171)
// Range minimum query.cpp : This file contains the 'main' function. Program execution begins and ends there.
//
#include <iostream>
#include <fstream>
#define NMAX 100060
#define MAXLOGN 18
std::ifstream fin("rmq.in");
std::ofstream fout("rmq.out");
using namespace std;
int N, M;
int A[NMAX], RMQ[NMAX][MAXLOGN];
int lg2[NMAX];
static inline void Read()
{
fin >> N >> M;
for (int i = 0; i < N; i++)
fin >> A[i];
lg2[1] = 0, lg2[2] = 1;
for (int i = 3; i <= N; i++)
lg2[i] = lg2[i / 2] + 1;
}
static inline void RangeMinimumQuery()
{
for (int i = 0; i < N; i++)
RMQ[i][0] = i;
for (int j = 1; 1 << j <= N; j++)
for (int i = 0; i + (1 << j) - 1 < N; i++)
if (A[RMQ[i][j - 1]] < A[RMQ[i + (1 << (j - 1))][j - 1]])
RMQ[i][j] = RMQ[i][j - 1];
else
RMQ[i][j] = RMQ[i + (1 << (j - 1))][j - 1];
}
static inline void Solve()
{
for (int x, y; M; M--)
{
fin >> x >> y;
x--, y--;
int ans;
int k = lg2[y - x + 1];
if (A[RMQ[x][k]] < A[RMQ[y - (1 << k) + 1][k]])
ans = A[RMQ[x][k]];
else
ans = A[RMQ[y - (1 << k) + 1][k]];
fout << ans << "\n";
}
}
int main()
{
Read();
RangeMinimumQuery();
Solve();
return 0;
}