Pagini recente » Cod sursa (job #391484) | Cod sursa (job #2204135) | Cod sursa (job #865779) | Cod sursa (job #161163) | Cod sursa (job #2625319)
#include <iostream>
#include <cmath>
#include <fstream>
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
int rmq[20][100000];
int main(){
int n,m;
f>>n>>m;
for (int i = 0; i < n; i++)
f >> rmq[0][i];
for (int i = 1; (1 << i) <= n; i++) // i <= log 2 n
for (int j = 0; j < n ; j++){
if(n<=j + (1 << (i - 1))){
rmq[i][j] = rmq[i-1][j]; //rmq[i][j] = min(rmq[i-1][j],rmq[n-1][n-1]);
}
else
rmq[i][j] = min(rmq[i-1][j],rmq[i-1][j + (1 << (i - 1))]);
}
int x,y;
for(int i=0;i<m;i++) {
f >> x >> y;
x--;
y--;
int k = (int)log2(y - x + 1); // cea mai mare putare a lui 2 <= lungimea intervalului meu
g << min(rmq[k][x],rmq[k][y - (1 << k) + 1]) << '\n';
}
f.close();
g.close();
return 0;
}