Pagini recente » Cod sursa (job #2654739) | Cod sursa (job #383862) | Cod sursa (job #2354009) | Cod sursa (job #51919) | Cod sursa (job #2902555)
#include <fstream>
#include <algorithm>
#include <cmath>
#include <iostream>
using namespace std;
int rmq[17][100010];
int rmq_query(int left, int right) // range min
{
int log = log2(right - left + 1); // parte intreaga din log
if (log == log2(right - left + 1)) // daca intervalul e putere a lui 2
return rmq[log][left];
return min(rmq[log][left], rmq[log][right - (1 << log) + 1]); // altfel il compunem din 2 subintervale care se suprapun
}
int main()
{
ifstream f("rmq.in");
ofstream g("rmq.out");
int nr_valori, nr_operatii;
f >> nr_valori >> nr_operatii;
for (int i = 1; i <= nr_valori; i++)
f >> rmq[0][i];
for (int j = 1; 1 << j < nr_valori; j++)
for (int i = 1; i + (1 << (j - 1)) <= nr_valori; i++)
rmq[j][i] = min(rmq[j - 1][i], rmq[j - 1][i + (1 << (j - 1))]); // construim range min query
int left, right;
for (int o = 0; o < nr_operatii; o++)
{
f >> left >> right;
g << rmq_query(left, right) << "\n";
}
}