Pagini recente » Monitorul de evaluare | Cod sursa (job #2552627) | Cod sursa (job #1321126) | Cod sursa (job #1340162) | Cod sursa (job #3358936)
// https://www.infoarena.ro/problema/rmq
// sparse table pe minim, query O(1) dupa preprocesare O(n log n)
// min e idempotent => cele doua blocuri de lungime 2^k se pot suprapune
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
const int MAXN = 100001;
const int LOG = 17;
int a[MAXN];
int sp[LOG][MAXN];
int lg[MAXN];
int main() {
int n, m;
fin >> n >> m;
for (int i = 0; i < n; i++)
fin >> a[i];
lg[1] = 0;
for (int i = 2; i <= n; i++)
lg[i] = lg[i / 2] + 1;
for (int i = 0; i < n; i++)
sp[0][i] = a[i];
for (int k = 1; (1 << k) <= n; k++)
for (int i = 0; i + (1 << k) <= n; i++)
sp[k][i] = min(sp[k - 1][i], sp[k - 1][i + (1 << (k - 1))]);
for (int q = 0; q < m; q++) {
int x, y;
fin >> x >> y;
int l = x - 1, r = y - 1; // problema indexeaza de la 1
int k = lg[r - l + 1];
fout << min(sp[k][l], sp[k][r - (1 << k) + 1]) << '\n';
}
return 0;
}