Pagini recente » Cod sursa (job #776411) | Cod sursa (job #1566870) | Cod sursa (job #581414) | Cod sursa (job #2104892) | Cod sursa (job #2332872)
// #include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>
#include <cmath>
#define pii pair<int, int>
#define vec vector
#define MAXN 100001
using namespace std;
int a[MAXN];
int rmq[20][MAXN];
int logOf[MAXN];
void testcase() {
ifstream cin("rmq.in");
int n, m;
cin >> n >> m;
// int a[n];
for (int i = 0; i < n; i++) {
cin >> rmq[0][i];
}
// fast floor log calculation
// vector<int> logOf(n + 1);
logOf[0] = 0;
logOf[1] = 0;
for (int i = 2; i <= n; i++) {
logOf[i] = logOf[i / 2] + 1;
}
int biggestPower = logOf[n];
// vec<vec<int> > rmq(n, vec<int>(biggestPower + 1)); // [from][dist] for 2^dist
// for (int i = 0; i < n; i++) rmq[i][0] = a[i];
int K = 1;
for (int pow2 = 1; pow2 <= biggestPower; pow2++) {
for (int from = 0; from < n; from++) {
int next = from + K; //(1 << (pow2 - 1));
if (next >= n) break; // adev
rmq[pow2][from] = min(rmq[pow2 - 1][from], rmq[pow2 - 1][next]);
}
K *= 2;
}
// answer the queries in O(1)
ofstream cout("rmq.out");
int from, to;
for (int i = 0; i < m; i++) {
cin >> from >> to;
--from; --to;
int dist = to - from + 1;
int logDist = logOf[dist];
cout << min(rmq[logDist][from], rmq[logDist][to - (1 << logDist) + 1]) << endl;
}
cin.close();
cout.close();
}
int main() {
// ios_base::sync_with_stdio(false);
// cin.tie(0);
testcase();
return 0;
}