Pagini recente » Borderou de evaluare (job #2574461) | Cod sursa (job #3224734)
#include<fstream>
std::ifstream fin("rmq.in");
std::ofstream fout("rmq.out");
const int MAX = 1e5 + 5;
const int LOG_MAX = 20;
int n, m, rmq[LOG_MAX][MAX], E[MAX];
void init() {
fin >> n >> m;
for (int j = 1; j <= n; ++j)
fin >> rmq[0][j];
for (int i = 1; (1<<i) <= n; ++i)
for (int j = 1; j <= n; ++j) {
rmq[i][j] = rmq[i - 1][j];
int p = j + (1<<(i - 1));
if (p <= n and rmq[i][j] > rmq[i - 1][p])
rmq[i][j] = rmq[i - 1][p];
}
E[1] = 0;
for (int i = 2; i <= n; ++i)
E[i] = 1 + E[i / 2];
}
void query(int st, int dr) {
int len = dr - st + 1, e = E[len];
fout << std::min(rmq[e][st], rmq[e][dr - (1 << e) + 1]) << '\n';
}
void solve_queries() {
int x, y;
for (int i = 1; i <= m; ++i) {
fin >> x >> y;
query(x, y);
}
}
int main() {
init();
solve_queries();
}