Pagini recente » Cod sursa (job #965332) | Cod sursa (job #439316) | Cod sursa (job #2071497) | Cod sursa (job #271406) | Cod sursa (job #2955644)
#include <fstream>
using namespace std;
ifstream cin("rmq.in");
ofstream cout("rmq.out");
const int MAX = 1e5 + 1;
int rmq[18][MAX] , n , m , log[MAX];
//rmq[i][j] = minimul din intervalul care se termina cu j si are lungimea =
// 2 la puterea i
void preproc(){
log[1] = 0;
for(int i = 2 ; i <= n ; i++){
log[i] = log[i/2] + 1;
}
for(int i = 1 ; i <= log[n] ; i++){
for(int j = n ; j >= (1 << i) ; j--){
rmq[i][j] = min(rmq[i-1][j],rmq[i-1][j-(1 << (i-1))]);
}
}
}
void query(){
int a , b;
cin >> a >> b;
int val = b - a + 1;
int l = log[val];
int p = (1<<l);
cout << min(rmq[l][b],rmq[l][a+p-1]) << '\n';
}
int main()
{
cin >> n >> m;
for(int i = 1 ; i <= n; i++)
cin >> rmq[0][i];
preproc();
while(m--) query();
return 0;
}