Pagini recente » Cod sursa (job #1875521) | Cod sursa (job #2317639) | Cod sursa (job #469948) | Cod sursa (job #1518206) | Cod sursa (job #2037309)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");
#define MAX 100000
#define MAXL 20
int N, M;
int v[MAX];
int dp[MAX][MAXL];
void BuildDP()
{
for (int i = 0; i < N; i++)
{
dp[i][0] = i;
}
for (int j = 1; (1 << j) <= N; j++)
{
for (int i = 0; i + (1 << j) - 1 < N; i++)
{
if (v[dp[i][j - 1]] < v[dp[i + (1 << (j - 1))][j - 1]])
dp[i][j] = dp[i][j - 1];
else
dp[i][j] = dp[i + (1 << (j - 1))][j - 1];
}
}
}
int Query(int x, int y)
{
int dif = y - x + 1;
int p = 0;
while((1 << (1 + p)) <= dif) p++;
return min(v[dp[x][p]], v[dp[y - (1 << p) + 1][p]]);
}
int main()
{
in >> N >> M;
for (int i = 0; i < N; i++)
{
in >> v[i];
}
BuildDP();
for (int i = 0; i < M; i++)
{
int x, y;
in >> x >> y;
out << Query(x - 1 , y - 1) << '\n';
}
}