Pagini recente » Cod sursa (job #1040544) | Cod sursa (job #1328181) | Cod sursa (job #2015359) | Istoria paginii runda/simulare_oji_13_03_2023 | Cod sursa (job #1652693)
#include <fstream>
#include <math.h>
using namespace std;
ifstream f ("rmq.in");
ofstream g ("rmq.out");
int v[100005], best[100005][18], n, m;
int minim (int a, int b)
{
if (a < b)
return a;
return b;
}
void precalc ()
{
for (int i = 1; i <= n; i ++)
best[i][0] = i;
for (int j = 1; (1 << j) <= n; j ++)
for (int i = 1; (i + (1 << j) - 1) <= n; i ++)
if (v[best[i][j - 1]] < v[best[i + (1 << (j - 1))][j - 1]])
best[i][j] = best[i][j - 1];
else
best[i][j] = best[i + (1 << (j - 1))][j - 1];
}
int rmq (int x, int y)
{
int k = log2 (y - x + 1);
if (v[best[x][k]] < v[best[y - (1 << k) + 1][k]])
return v[best[x][k]];
return v[best[y - (1 << k) + 1][k]];
}
int main()
{
int x, y;
f >> n >> m;
for (int i = 1; i <= n; i ++)
f >> v[i];
precalc ();
for (int i = 1; i <= m; i ++)
{
f >> x >> y;
g << rmq (x, y) << '\n';
}
f.close ();
g.close ();
return 0;
}