Pagini recente » Cod sursa (job #1474652) | Cod sursa (job #2189159) | Cod sursa (job #1740816) | Cod sursa (job #2301812) | Cod sursa (job #3183045)
/**
* Author: Andu Scheusan (not_andu)
* Created: 10.12.2023 15:22:53
*/
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
#define INFILE "rmq.in"
#define OUTFILE "rmq.out"
typedef long long ll;
const int NMAX = 100'000, LOGMAX = 16;
int lg[NMAX + 1]; // floor(log2(n)) (parte intreaga inferioara)
struct Rmq
{
vector<int> rmq[LOGMAX + 1];
int n;
Rmq(int _n, vector<int> &v)
{
n = _n;
for (int i = 1; i <= n; ++i)
{
rmq[0][i] = v[i];
}
for (int bit = 1; bit <= lg[n]; ++bit)
{
for (int i = 1; i + (1 << (bit - 1)) <= n; ++i)
{
rmq[bit][i] = min(rmq[bit - 1][i], rmq[bit - 1][i + (1 << (bit - 1))]);
}
}
}
int query(int l, int r)
{
int layer = lg[r - l + 1];
int min1 = rmq[layer][l];
int min2 = rmq[layer][r - (1 << layer) + 1];
return min(min1, min2);
}
};
int main()
{
int n, q;
cin >> n >> q;
lg[1] = 0; // log2(n) = log2(n/2 * 2) = log2(n/2) + log2(2) = log2(n/2) + 1
for (int i = 2; i <= n; ++i)
{
lg[i] = lg[i / 2] + 1;
}
vector<int> v(n + 1, 0);
for (int i = 1; i <= n; i++)
{
cin >> v[i];
}
Rmq rmq(n, v);
while (q--)
{
int l, r;
cin >> l >> r;
cout << rmq.query(l, r) << '\n';
}
return 0;
}