Pagini recente » Cod sursa (job #2181853) | Cod sursa (job #165887) | Cod sursa (job #1531185) | Cod sursa (job #1668091) | Cod sursa (job #1138746)
#include <fstream>
#define MAX 100001
using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");
int v[MAX];
int rmq[MAX][17];
int lg[MAX];
int main() {
int n, m;
in>>n>>m;
for (int i = 1; i <= n; i++) {
in>>v[i];
rmq[i][0] = v[i];
}
int piutere = 1, cate = 0;
for (int i = 1; i <= n; i++) {
while (piutere * 2 <= i){
piutere *= 2;
cate++;
}
lg[i] = cate;
for (int j = 1; 1<<j <= i; j++) {
int a = rmq[i - (1<<(j - 1))][j - 1];
int b = rmq[i][j - 1];
rmq[i][j] = a < b ? a : b;
}
}
int a, b;
for (int i = 1; i <= m; i++) {
in>>a>>b;
int p2 = lg[b - a + 1];
int A = rmq[a + (1<<p2) - 1][p2];
int B = rmq[b][p2];
int r = A < B ? A : B;
out<<r<<"\n";
}
/* afisare
for (int i = 1; i <= 16; i++) {
printf("%d ",lg[i]);
}
printf("\n");
for (int i = 0; i <= 16; i++) {
for (int j = 1; j <= n; j++) {
printf("%3d ",rmq[j][i]);
}
printf("\n");
}*/
return 0;
}