Pagini recente » Cod sursa (job #681576) | Cod sursa (job #2756310) | Cod sursa (job #1558175) | Cod sursa (job #2054287) | Cod sursa (job #2789474)
#include <iostream>
#include <fstream>
#include <vector>
#define NMAX 100000
#define LOGMAX 20
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int N, M, x, y;
int arr[NMAX], lg2[NMAX + 1];
int rmq[LOGMAX][NMAX];
void preprocesare()
{
for (int i = 2; i <= N; i++)
lg2[i] = lg2[i/2] + 1;
for (int i = 0; i < N; i++)
rmq[0][i] = i;
for (int k = 1; (1 << k) <= N; k++)
for (int i = 0; i + (1 << k) - 1 < N; i++)
rmq[k][i] = arr[rmq[k - 1][i]] < arr[rmq[k - 1][i + (1 << (k - 1))]] ? rmq[k - 1][i] : rmq[k - 1][i + (1 << (k - 1))];
}
int answerQuery(int a, int b)
{
int k = lg2[b - a + 1];
return arr[rmq[k][a]] < arr[rmq[k][b - (1 << k) + 1]] ? rmq[k][a] : rmq[k][b - (1 << k) + 1];
}
int main()
{
fin >> N >> M;
for (int i = 0; i < N; ++i) fin >> arr[i];
preprocesare();
while (M--)
{
fin >> x >> y;
fout << arr[answerQuery(x - 1, y - 1)] << '\n';
}
fin.close();
fout.close();
return 0;
}