Pagini recente » Cod sursa (job #1525631) | Cod sursa (job #1797550) | Borderou de evaluare (job #853204) | Cod sursa (job #2669740) | Cod sursa (job #1640313)
#include <iostream>
#include <vector>
#include <fstream>
#include <cmath>
#include <string>
#define maxN 100000
using namespace std;
int M[maxN][30];
int log(int n){
int a = 0, b = 1;
while ((b << 1) <= n){
a++;
b <<= 1;
}
return a;
}
int main()
{
ifstream f("rmq.in");
ofstream g("rmq.out");
int n, m;
f >> n >> m;
for (int i = 1; i <= n; ++i){
int x;
f >> x;
M[i][0] = x;
}
int lim = log(n);
for (int j = 1; j <= lim; j++){
int a = 1 << (j - 1);
for (int i = 1; i + (a << 1) <= n; ++i){
if (M[i][j - 1] <= M[i + a][j - 1])
M[i][j] = M[i][j - 1];
else
M[i][j] = M[i + a][j - 1];
}
}
for (int i = 0; i < m; ++i){
int l, r;
f >> l >> r;
int a = log(l - r + 1);
if (M[l][a] < M[r - (1 << a) + 1][a])
g << M[l][a] << "\n";
else
g << M[r - (1 << a) + 1][a] << "\n";
}
f.close();
g.close();
return 0;
}