Pagini recente » Istoria paginii runda/oni_2015_10_v1.1lmao | Cod sursa (job #1648486) | Cod sursa (job #2725680) | Istoria paginii runda/14_martie_simulare_oji_2024_clasa_10/clasament | Cod sursa (job #2753619)
#include <fstream>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
const int N = 1000001;
int n, v[N];
int d[30][N];
int lg[N];
void rmqGen() {
int a, b;
lg[2] = 1;
for (int i = 3; i <= n; ++i) {
lg[i] = lg[i / 2] + 1;
}
for (int i = 1; i <= n; ++i) {
d[0][i] = i;
}
for (int i = 1; (1 << i) <= n; ++i) {
for (int j = 1; j + (1 << i) - 1 <= n; ++j) {
a = d[i - 1][j];
b = d[i - 1][j + (1 << (i - 1))];
if (v[a] < v[b]) {
d[i][j] = a;
} else {
d[i][j] = b;
}
}
}
}
int rmq(int x, int y) {
if (x > y) {
swap(x, y);
}
int range = y - x + 1;
int k = lg[range];
return min(v[d[k][x]], v[d[k][y - (1 << k) + 1]]);
}
int main() {
int nrq, x, y;
fin >> n >> nrq;
for (int i = 1; i <= n; ++i) {
fin >> v[i];
}
rmqGen();
for (int i = 1; i <= nrq; ++i) {
fin >> x >> y;
fout << rmq(x, y) << '\n';
}
fin.close();
fout.close();
return 0;
}