Pagini recente » Cod sursa (job #1731189) | Cod sursa (job #2009949) | Cod sursa (job #594553) | Cod sursa (job #272279) | Cod sursa (job #3130440)
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
int rmq[100003][17];
int find(int a[], int left, int right, int l, int k){
int p = pow(2, k);
if (a[rmq[left][k]] <= a[rmq[left + l - p][k]]) {
return a[rmq[left][k]];
} else {
return a[rmq[right - p + 1][k]];
}
}
int main(){
ifstream f("rmq.in");
ofstream g("rmq.out");
int n, m;
f>>n>>m;
int a[n], i = 0, l = log(n);
while(i<n){
f>>a[i++];
}
for (int i = 0; i < n; i++) {
rmq[i][0] = i;
}
for (int j = 1; pow(2, j) <= n; j++) {
int p = pow(2, j-1);
for (int i = 0; i + p*2 - 1 < n; i++) {
if (a[rmq[i][j - 1]] < a[rmq[i + p][j - 1]]) {
rmq[i][j] = rmq[i][j - 1];
} else {
rmq[i][j] = rmq[i + p][j - 1];
}
}
}
int b, c;
while(m>0){
f>>b>>c;
b--; c--;
int l = c-b+1, k = log(c-b+1);
g<<find(a, b, c, l, k)<<endl;
m--;
}
f.close();
g.close();
return 0;
}