Pagini recente » Cod sursa (job #693951) | Cod sursa (job #1730136) | Cod sursa (job #2171478) | Cod sursa (job #2206639) | Cod sursa (job #3229186)
#include <fstream>
#include <vector>
#include <cassert>
using namespace std;
const int INF = 1e9;
/// I know that this isn't practical, but it is only infoarena
ifstream cin("rmq.in");
ofstream cout("rmq.out");
class RMQ
{
private:
int n_size;
int log_2;
vector<vector<int>> rmq;
int GetLog2(int n)
{
int curent_log_2 = 0;
while((1 << curent_log_2) <= n)
curent_log_2++;
return curent_log_2;
}
public:
RMQ() : n_size(0), log_2(0) {};
RMQ(int n_size, vector<int> &elements)
{
this->n_size = n_size;
this->log_2 = GetLog2(n_size);
rmq.resize(n_size, vector<int>(log_2, INF));
for(int i = 0; i < n_size; i++)
rmq[i][0] = elements[i];
for(int k = 1; k <= log_2; k++)
for(int i = 0; i + (1 << k) - 1 < n_size; i++)
rmq[i][k] = min(rmq[i][k - 1], rmq[i + (1 << (k - 1))][k - 1]);
}
int QueryMin(int left, int right)
{
int k = GetLog2(right - left + 1) - 1;
return min(rmq[left][k], rmq[right - (1 << k) + 1][k]);
}
};
int main() {
int n, Q;
cin >> n >> Q;
vector<int> elements(n);
for(int i = 0; i < n; i++)
cin >> elements[i];
RMQ my_rmq(n, elements);
while(Q--)
{
int left, right;
cin >> left >> right;
left--; right--;
cout << my_rmq.QueryMin(left, right) << '\n';
}
return 0;
}
/// PS: Daca vezi asta bro, da-mi si mie debug please!