Pagini recente » Cod sursa (job #549928) | Cod sursa (job #2186284) | Cod sursa (job #1938893) | Cod sursa (job #1058097) | Cod sursa (job #1110208)
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
template<class Type>
class RangeMinimumQuery {
public:
RangeMinimumQuery(const vector<Type> &_values):
values(_values),
data(vector< vector<int> >()),
log2(vector<int>(int(_values.size()) + 1, -1)) {
log2[1] = 0;
for (int i = 2; i <= Size(); ++i)
log2[i] = log2[i / 2] + 1;
data = vector< vector<int> >(log2[Size()] + 1, vector<int>(Size(), -1));
for (int i = 0; i < Size(); ++i)
data[0][i] = i;
for (int step = 1, length = 1; step < int(data.size()); ++step, length <<= 1) {
for (int i = 0; i + 2 * length <= Size(); ++i) {
if (values[data[step - 1][i]] < values[data[step - 1][i + length]])
data[step][i] = data[step - 1][i];
else
data[step][i] = data[step - 1][i + length];
}
}
}
int Size() const {
return int(values.size());
}
int QueryIndex(const int from, const int to) const {
int step = log2[to - from + 1];
if (values[data[step][from]] < values[data[step][to - (1 << step) + 1]])
return data[step][from];
else
return data[step][to - (1 << step) + 1];
}
Type QueryValue(const int from, const int to) const {
return values[QueryIndex(from, to)];
}
private:
vector<Type> values;
vector< vector<int> > data;
vector<int> log2;
};
int main() {
ifstream cin("rmq.in");
ofstream cout("rmq.out");
int n, q;
cin >> n >> q;
vector<int> values = vector<int>(n);
for (int i = 0; i < n; ++i)
cin >> values[i];
RangeMinimumQuery<int> rmq = RangeMinimumQuery<int>(values);
for (; q > 0; --q) {
int from, to;
cin >> from >> to;
cout << rmq.QueryValue(--from, --to) << "\n";
}
cin.close();
cout.close();
return 0;
}