Pagini recente » Borderou de evaluare (job #2007025) | Borderou de evaluare (job #1489596) | Borderou de evaluare (job #2007024) | Borderou de evaluare (job #1489613) | Cod sursa (job #3274605)
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
const int MAXN = 100000;
const int LOG = 17; // log2(100000) ≈ 16.6
int table[MAXN][LOG];
int logTable[MAXN + 1];
void buildSparseTable(const std::vector<int> &nums, int N)
{
for (int i = 0; i < N; i++)
{
table[i][0] = nums[i];
}
for (int j = 1; (1 << j) <= N; j++)
{
for (int i = 0; (i + (1 << j) - 1) < N; i++)
{
table[i][j] = std::min(table[i][j - 1], table[i + (1 << (j - 1))][j - 1]);
}
}
logTable[1] = 0;
for (int i = 2; i <= N; i++)
{
logTable[i] = logTable[i / 2] + 1;
}
}
int query(int L, int R)
{
int j = logTable[R - L + 1];
return std::min(table[L][j], table[R - (1 << j) + 1][j]);
}
int main()
{
std::ifstream fin("rmq.in");
std::ofstream fout("rmq.out");
int N, M;
fin >> N >> M;
std::vector<int> nums(N);
for (int i = 0; i < N; i++)
{
fin >> nums[i];
}
buildSparseTable(nums, N);
for (int i = 0; i < M; i++)
{
int x, y;
fin >> x >> y;
fout << query(x - 1, y - 1) << "\n";
}
fin.close();
fout.close();
return 0;
}