Pagini recente » Cod sursa (job #2192230) | Cod sursa (job #781085) | Cod sursa (job #2337498) | Cod sursa (job #3242376) | Cod sursa (job #2973018)
#include <iostream>
#include <fstream>
using namespace std;
const int dmax = 100001;
ifstream in("rmq.in");
ofstream out("rmq.out");
int v[dmax];
int log2[dmax]; // lg[i] = valoarea lui log2(i)
int rmq[18][dmax]; // rmq[i][j] = valoarea minima dintr-un interval de lungime 2^i care se termina pe pozitia j
int main()
{
int n, q, i, j, l, a, b;
in >> n >> q;
for (i = 1; i <= n; i++) {
in >> v[i];
}
// formare vector log2
log2[1] = 0; //log2(1) = 0
for (i = 2; i <= n; i++) {
log2[i] = log2[i/2] + 1; // log2(a*b) = log2(a) + log2(b), unde a = i/2 si b = 2
}
// rmq
for (j = 1; j <= n; j++) {
// valoarea minima dintr-un interval de lungime 1 care se termina pe pozitia j
// este practic intervalul [j,j] -> element minim = v[j]
rmq[0][j] = v[j];
}
for (i = 1; i <= log2[n]; i++) {
for (j = 1; j <= n; j++) {
rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j - (1 << (i - 1))]);
}
}
// for (i = 0; i <= log2[n]; i++) {
// for (j = 1; j <= n; j++) {
// cout << rmq[i][j] << " ";
// }
// cout << "\n";
// }
for (i = 1; i <= q; i++) {
in >> a >> b;
l = log2[b - a + 1];
out << min(rmq[l][b], rmq[l][a + (1 << l) - 1]) << "\n";
}
return 0;
}