Pagini recente » Cod sursa (job #2593760) | Cod sursa (job #87184) | Cod sursa (job #206727) | Cod sursa (job #2273470) | Cod sursa (job #1046814)
#include<iostream>
#include<fstream>
#include<math.h>
using namespace std;
const int MAXN = 100000;
const int LOGMAXN = 17;
int A[MAXN];
int M[MAXN][LOGMAXN];
double Log2(double n)
{
return log(n) / log(2);
}
void preProcesare(int N)
{
for (int i = 0; i < N; i++){
M[i][0] = i;
}
for (int j = 1; 1 << j <= N; j++){
for (int i = 0; i + (1 << j) - 1 < N; i++){
if (A[M[i][j - 1]] < A[M[i + (1 << (j - 1))][j - 1]]){
M[i][j] = M[i][j - 1];
}
else{
M[i][j] = M[i + (1 << (j - 1))][j - 1];
}
}
}
}
int main()
{
ifstream f("rmq.in");
ofstream o("rmq.out");
int n = 0; int m = 0;
f >> n >> m;
for (int i = 0; i < n; i++){
f >> A[i];
}
preProcesare(n);
for (int i = 0; i < m; i++){
int x, y;
f >> x >> y;
x--; y--;
int k = Log2(y-x+1);
int p = pow(2, k);
if (A[M[x][k]] <= A[M[y - p+1][k]]){
o << A[M[x][k]] << '\n';
}
else{
o << A[M[y - p+1][k]] << '\n';
}
}
}