Pagini recente » Borderou de evaluare (job #366968) | Cod sursa (job #2234715) | Cod sursa (job #1336237) | Cod sursa (job #1716892) | Cod sursa (job #1863469)
#include <bits/stdc++.h>
using namespace std;
template <class T, class cClass>
class sparseTable {
private:
int n;
vector <int> lg;
vector <vector <T>> t;
public:
sparseTable(vector <T> &v) {
n = v.size();
lg = vector <int>(n + 1, 0);
for (int i = 2; i <= n; i++) {
lg[i] = lg[i >> 1] + 1;
}
t = vector <vector <T>> (lg[n] + 1, vector <T> (n, 0));
t[0] = v;
for (int i = 0; i < lg[n]; i++) {
for (int j = 0; j < n; j++) {
t[i + 1][j] = t[i][j + (1 << i)];
if (cClass()(t[i + 1][j], t[i][j]) == false)
t[i + 1][j] = t[i][j];
}
}
}
T find(int le, int ri) {
int l = lg[ri - le + 1];
int sol = t[l][ri - (1 << l) + 1];
if (cClass()(sol, t[l][le]) == false)
sol = t[l][le];
return sol;
}
};
int main() {
ifstream cin("rmq.in");
ofstream cout("rmq.out");
int n;
int m;
cin >> n;
cin >> m;
vector <int> v(n);
for (int i = 0; i < n; i++) cin >> v[i];
sparseTable <int, less <int>> Q(v);
while (m--) {
int l;
int r;
cin >> l;
cin >> r;
l--;
r--;
cout << Q.find(l, r) << "\n";
}
return 0;
}