Pagini recente » Cod sursa (job #1348223) | Cod sursa (job #1260030) | Cod sursa (job #1069815) | Cod sursa (job #2954460) | Cod sursa (job #1248703)
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
#include <algorithm>
typedef std::vector< std::vector<int> > matrix;
matrix preComputeRmq(std::vector<int> &v)
{
matrix rmq_D(v.size());
size_t lg = static_cast<std::size_t>(log(v.size())/log(2)) + 1;
for (matrix::iterator it = rmq_D.begin(); it != rmq_D.end(); ++it)
it->reserve(lg);
for (std::size_t i = 0; i < v.size(); ++i)
rmq_D[i][0] = v[i];
for (std::size_t i = 1; i < lg; ++i)
for (std::size_t j = 0; j + (1 << i) - 1 < v.size(); ++j)
rmq_D[j][i] = std::min(rmq_D[j][i - 1],
rmq_D[j + (1 << (i - 1))][i - 1]);
return rmq_D;
}
int main()
{
std::ifstream fin("rmq.in");
freopen("rmq.out", "w", stdout);
int N, M;
fin >> N >> M;
std::vector<int> v(N);
for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it)
fin >> *it;
std::vector<int> lg(N + 1);
for (int i = 1; i <= N; ++i)
lg[i] = static_cast<std::size_t>(log(i));
matrix rmq_D = preComputeRmq(v);
for (; M--; ) {
int i, j;
fin >> i >> j;
--i, --j;
int k = lg[j - i + 1];
printf("%d\n", std::min(rmq_D[i][k], rmq_D[j - (1 << k) + 1][k]));
}
fin.close();
return 0;
}