Pagini recente » Cod sursa (job #958581) | Cod sursa (job #1249004) | Cod sursa (job #943808) | Cod sursa (job #1372081) | Cod sursa (job #2899304)
#include <fstream>
#include <cmath>
#include <algorithm>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
const int dim = 1e5 + 2;
int v[dim], n;
int getLog(int n) {
int lg = -1, pw = 1;
for(int i = 1; i <= n; i++) {
if(pw == i) {
lg++;
pw *= 2;
}
}
return lg;
}
int sparseTable[100002][18];
int rmq(int st, int dr) {
int l = dr - st + 1;
int k = getLog(l);
return min(v[ sparseTable[st][k] ], v[ sparseTable[st + l - (int)pow(2, k)][k] ]);
}
int main() {
int k;
fin >> n >> k;
for(int i = 0; i < n; i++)
fin >> v[i];
for(int i = 0; i < n; i++)
sparseTable[i][0] = i;
int p2 = 2; //2^j
for(int j = 1; p2 <= n; j++) {
for(int i = 0; i + p2 - 1 < n; i++) {
if(v[ sparseTable[i][j - 1] ] < v[ sparseTable[i + p2/2][j - 1] ])
sparseTable[i][j] = sparseTable[i][j - 1];
else sparseTable[i][j] = sparseTable[i + p2/2][j - 1];
}
p2 *= 2;
}
int st, dr;
for(int i = 0; i < k; i++) {
fin >> st >> dr;
fout << rmq(--st, --dr) << '\n';
}
fin.close();
fout.close();
return 0;
}