Pagini recente » Cod sursa (job #345834) | Cod sursa (job #1597352) | Cod sursa (job #566343) | Cod sursa (job #1109725) | Cod sursa (job #2875872)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f ("rmq.in");
ofstream g ("rmq.out");
const int INF = __INT_MAX__;
vector <int> tree;
void PowOf2(int &n)
{
int pow = 1;
while (pow < n)
{
pow = pow << 1;
}
n = pow;
}
int Query(int currentNode, int treeLeft, int treeRight,
int queryLeft, int queryRight)
{
if (queryLeft <= treeLeft && treeRight <= queryRight) return tree[currentNode];
if (treeRight < queryLeft || queryRight < treeLeft) return INF;
int middle = (treeLeft + treeRight) / 2;
return min(Query(2 * currentNode, treeLeft, middle, queryLeft, queryRight),
Query(2 * currentNode + 1, middle + 1, treeRight, queryLeft, queryRight));
}
int main()
{
int n, q;
f >> n >> q;
int temp = n;
PowOf2(n);
tree.resize(2 * n);
for (int i = 0; i < temp; i++)
{
f >> tree[n + i];
}
for (unsigned int i = temp + n; i < tree.size(); i++)
{
tree[i] = INF;
}
for (int i = n - 1; i >= 1; i--)
{
tree[i] = min(tree[2*i], tree[2*i + 1]);
}
for (int i = 1; i <= q; i++)
{
int left, right;
f >> left >> right;
g << Query(1, 1, n, left, right) << "\n";
}
}