Pagini recente » Cod sursa (job #814932) | Cod sursa (job #1294532) | Cod sursa (job #1065198) | Cod sursa (job #406068) | Cod sursa (job #3199238)
#include <iostream>
#include <algorithm>
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
#define cin fin
#define cout fout
int bits(int x);
int rangeMinimum(vector<vector<int>>& sparseTable, int left, int right);
int main()
{
int n, m;
vector<vector<int>> sparseTable;
cin >> n >> m;
sparseTable.resize(bits(n));
sparseTable[0].resize(n);
for(int i = 0; i < n; i++)
{
cin >> sparseTable[0][i];
}
for(int exp = 1, pow2 = 2; exp < sparseTable.size(); exp++, pow2 *= 2)
{
sparseTable[exp].resize(n - pow2 + 1);
for(int i = 0; i < sparseTable[exp].size(); i++)
{
sparseTable[exp][i] = min(sparseTable[exp - 1][i], sparseTable[exp - 1][i + pow2 / 2]);
}
}
for(int i = 0, left, right; i < m; i++)
{
cin >> left >> right;
left--;
right--;
cout << rangeMinimum(sparseTable, left, right) << '\n';
}
return 0;
}
int bits(int x)
{
int bits_ = 0;
while(x > 0)
{
x >>= 1;
bits_++;
}
return bits_;
}
int rangeMinimum(vector<vector<int>>& sparseTable, int left, int right)
{
int exp = 0, pow2 = 1, sizeCopy = right - left + 1;
while(sizeCopy > 0)
{
sizeCopy >>= 1;
exp++;
pow2 *= 2;
}
exp--;
pow2 /= 2;
return min(sparseTable[exp][left], sparseTable[exp][right - pow2 + 1]);
}