Pagini recente » Cod sursa (job #1930760) | Cod sursa (job #100152) | Cod sursa (job #1366187) | Cod sursa (job #2127546) | Cod sursa (job #1046148)
#include <fstream>
#include <cmath>
using namespace std;
ifstream in ("rmq.in");
ofstream out("rmq.out");
int n;
int v [100001];
int ma[100001][100];
void preprocess()
{
for (int i = 0; i < n; ++i)
ma[i][0] = i;
for (int j = 1; (1 << j) <= n; ++j)
for (int i = 0; i + (1 << j) - 1 < n; ++i)
if (v[ma[i][j - 1]] < v[ma[i + (1 << (j - 1))][j - 1]])
ma[i][j] = ma[i][j - 1];
else
ma[i][j] = ma[i + (1 << (j - 1))][j - 1];
}
int rmq(int x, int y)
{
int lg = log2 (y - x + 1);
if (v[ma[x][lg]] <= v[ma[y - (1 << lg) + 1][lg]])
return ma[x][lg];
else
return ma[y - (1 << lg) + 1][lg];
}
int main()
{
int m;
in >> n >> m;
for (int i = 0; i < n; ++i)
in >> v[i];
preprocess();
for (int i = 0; i < m; ++i)
{
int x, y;
in >> x >> y;
out << v[rmq(x - 1, y - 1)] << "\n";
}
return 0;
}