Pagini recente » Cod sursa (job #1063226) | Cod sursa (job #2639836) | Cod sursa (job #1954673) | Cod sursa (job #1133506) | Cod sursa (job #2396646)
#include <iostream>
#include <fstream>
#include <algorithm>
#define lgmax 17
#define nmax 100005
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int n, m, lg[nmax];
int v[lgmax][nmax];
void rmq()
{
int i;
lg[1] = 0;
for (i = 2; i<= n; i++)
lg[i] = lg[i/2] + 1;
//(2 ^ lg [i]) <= i &&
// i < (2 ^ (lg[i]+ 1)
for (int i = 1; (1 << i) <= n; i ++)
{
int l = 1 << (i - 1);
for (int j = 1; j <= n - (1 << i) + 1; j ++)
v[i][j] = min(v[i-1][j], v[i-1][j+l]);
//v[i][j] = j -> j + l * 2 - 1;
//v[i-1][j] = j -> j + l - 1;
//v[i-1][j+l] = j + l, j + l * 2 -1;
}
}
int main() {
fin >> n >> m;
for (int i = 1; i <= n; i ++)
fin >> v[0][i];
rmq();
for (int i = 1; i<= m; i++)
{
// 7 20, l = 14;
// p = 8;
// min(7, 7 + 2^3 - 1), V[3][7],
// min(20 - 2^3 + 1, 20), v[3][20-p+1]
int x, y;
fin >> x >> y;
int lg_val = lg[y-x+1];
fout << min(v[lg_val][x], v[lg_val][y - (1<<lg_val) + 1]) << "\n";
}
}