Pagini recente » Cod sursa (job #3133273) | Cod sursa (job #3143857) | Cod sursa (job #626114) | Cod sursa (job #2291219) | Cod sursa (job #3235466)
// solutie MadaliIoana
#include <fstream>
const int MAX_N = 100'005;
const int LOG = 17;
int a[MAX_N];
int m[MAX_N][LOG]; // m[i][j] is minimum among a[i..i+2^j-1]
int bin_log[MAX_N];
int query(int L, int R)
{ // O(1)
int length = R - L + 1;
int k = bin_log[length];
return std::min(m[L][k], m[R - (1 << k) + 1][k]);
}
int main()
{
std::ifstream fin("rmq.in");
std::ofstream fout("rmq.out");
// 1) read input
int M, N;
fin >> M >> N;
bin_log[1] = 0;
for (int i = 2; i <= M; i++)
{
bin_log[i] = bin_log[i / 2] + 1;
}
for (int i = 0; i < M; i++)
{
fin >> a[i];
m[i][0] = a[i];
}
// 2) preprocessing, O(N*log(N))
for (int k = 1; k < LOG; k++)
{
for (int i = 0; i + (1 << k) - 1 < M; i++)
{
m[i][k] = std::min(m[i][k - 1], m[i + (1 << (k - 1))][k - 1]);
}
}
// 3) answer queries
for (int i = 0; i < N; i++)
{
int l, r;
fin >> l >> r;
l -= 1;
r -= 1;
fout << query(l, r) << "\n";
}
fin.close();
fout.close();
return 0;
}