Pagini recente » Cod sursa (job #759386) | Cod sursa (job #2254817) | Cod sursa (job #2121709) | Cod sursa (job #2891992) | Cod sursa (job #1587423)
#include <fstream>
#include <vector>
#include <cmath>
std::vector < int > values;
std::vector < int > tree;
void build_tree(int node, int start, int end)
{
if(start == end)
{
tree[node] = start;
return;
}
int mid = (start + end) / 2;
build_tree(2 * node, start, mid);
build_tree(2 * node + 1, mid + 1, end);
if(values[tree[2 * node]] <= values[tree[2 * node + 1]])
tree[node] = tree[2 * node];
else
tree[node] = tree[2 * node + 1];
}
int rmq(int node, int start, int end, int s, int e)
{
if(s > end || e < start)
return -1;
if(start >= s && end <= e)
return tree[node];
int mid = (start + end) / 2;
int q1 = rmq(2 * node, start, mid, s, e);
int q2 = rmq(2 * node + 1, mid + 1, end, s, e);
if(q1 == -1)
return q2;
if(q2 == -1)
return q1;
if(values[q1] <= values[q2])
return q1;
return q2;
}
int main()
{
std::ifstream fin("rmq.in");
std::ofstream fout("rmq.out");
int n, q;
fin >> n >> q;
values.assign(n, 0);
for(int i = 0 ; i < n ; ++i)
fin >> values[i];
int tree_size = pow(2, log2(n) + 2);
tree.assign(tree_size, -1);
build_tree(1, 0, n - 1);
while(q--)
{
int s, e;
fin >> s >> e;
fout << values[rmq(1, 0, n - 1, s - 1, e - 1)] << "\n";
}
return 0;
}