Pagini recente » Cod sursa (job #2187857) | Clasament creare | Cod sursa (job #2637190) | Cod sursa (job #707778) | Cod sursa (job #3193126)
#include <iostream>
#include <fstream>
#define NMAX 100002
using namespace std;
ifstream fin ("rmq.in");
ofstream fout ("rmq.out");
int n, m, v[NMAX], rmq[17][NMAX], log[NMAX]; // 17 > aprox. log2 NMAX
/// rmq[i][j] = valoarea elementului minim din intervalul care incepe in j si are lungimea 2^i
int main()
{
fin >> n >> m;
for (int i = 1; i <= n; i++)
fin >> rmq[0][i];
/// preprocesare
for (int i = 1; (1<<i) <= n; i++) /// fiecare nivel din rmq
{
// (1<<i) <= n echivalent cu i <= log2 n
for (int j = 1; j + (1<<(i-1)) <= n; j++)
{
rmq[i][j] = min(rmq[i-1][j], rmq[i-1][j+(1<<(i-1))]);
}
}
log[1] = 0;
for (int i = 2; i <= n; i++)
log[i] = log[i/2] + 1;
for (int i = 1; i <= m; i++)
{
int a, b, logAB;
fin >> a >> b;
logAB = log[b-a];
fout << min(rmq[logAB][a], rmq[logAB][b - (1<<logAB) + 1]) << "\n";
}
return 0;
}