Mai intai trebuie sa te autentifici.
Cod sursa(job #2810946)
| Utilizator | Data | 30 noiembrie 2021 18:16:45 | |
|---|---|---|---|
| Problema | Range minimum query | Scor | 100 |
| Compilator | cpp-64 | Status | done |
| Runda | Arhiva educationala | Marime | 1.03 kb |
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin ("rmq.in");
ofstream fout ("rmq.out");
const int maxLog = 32;
const int maxN = 1e5 + 5;
int log[maxN];
int rmq[maxLog][maxN];
int a[maxN];
void precalculare_log (int n) {
log[1] = 0;
for(int i = 2; i <= n; ++i)
log[i] = log[i/2] + 1;
}
void build_rmq (int n) {
for(int i = 1; i <= n; ++i)
rmq[0][i] = a[i];
for(int step = 1; step <= log[n]; ++step)
for(int i = 1; i <= n - (1 << step) + 1; ++i)
rmq[step][i] = min(rmq[step-1][i],
rmq[step-1][i + (1 << (step-1))]);
}
int main()
{
int n, m; fin >> n >> m;
for(int i = 1; i <= n; ++i)
fin >> a[i];
precalculare_log(n);
build_rmq(n);
for(int k = 1; k <= m; ++k) {
int st, dr; fin >> st >> dr;
int dist = dr - st + 1;
fout << min(rmq[log[dist]][st],
rmq[log[dist]][dr - (1 << log[dist]) + 1]) << '\n';
}
return 0;
}
