Pagini recente » Cod sursa (job #733510) | Cod sursa (job #495607) | Cod sursa (job #977823) | Cod sursa (job #2586922) | Cod sursa (job #3133954)
//#include <iostream>
#include <fstream>
#include<vector>
using namespace std;
std::ifstream cin("rmq.in");
std::ofstream cout("rmq.out");
int _2la_x(int val){
if(val == 0) return 1;
return 1<<val;
}
int log2(int val){
if(val == 0 || val == 1)return 0;
return 1 + log2(val>>1);
}
int main() {
long long n, m;
vector<long long> numbers;
cin>>n>>m;
for(long long i=0;i<n;i++){
long long aux;
cin>>aux;
numbers.push_back(aux);
}
long long log2n = log2(n);
long long **rmq = new long long*[n];
for(int i = 0; i<n;i++){
rmq[i] = new long long[log2n+1];
}
for(long long i = 0; i<n;i++){
rmq[i][0] =numbers[i];
}
for(long long j = 1; _2la_x(j)-1 < n ; j++){
for(long long i=0; i + (_2la_x(j))-1 < n; i++){
if(rmq[i][j-1] < rmq[i + (_2la_x(j - 1))][j-1])
rmq[i][j] = rmq[i][j-1];
else
rmq[i][j] = rmq[i + (_2la_x(j - 1))][j-1];
}
}
for(long long i =0; i<m;i++){
long long x,y;
cin>>x>>y;
long long k=log2(y-x+1);
if(rmq[x-1][k] <= rmq[y - _2la_x(k)][k])
cout<<rmq[x-1][k]<<"\n";
else
cout<<rmq[y- _2la_x(k)][k]<<"\n";
}
for(long long i = 0; i<n;i++){
delete[] rmq[i];
}
delete[] rmq;
return 0;
}