Pagini recente » Cod sursa (job #425857) | Cod sursa (job #802502) | Cod sursa (job #2282306) | Cod sursa (job #3148018) | Cod sursa (job #1512762)
#include <fstream>
#define DIM 100010
using namespace std;
ifstream fin ("rmq.in");
ofstream fout("rmq.out");
int mySwap(int &x, int &y) {
int aux =x;
x = y;
y = aux;
}
int p[20];
int L[DIM];
int D[18][DIM];
int n, m, i, j, x, y, e;
int main () {
fin>>n>>m;
for (i=1;i<=n;i++)
fin>>D[0][i];
// calculez p[i] = 2 la puterea i
p[0] = 1;
for (i=1; p[i-1] <= n; i++)
p[i] = p[i-1] * 2;
for (i=1;p[i]<=n;i++)
for (j=1;j<=n;j++) {
// D[i][j] = minimul din secventa de lunfime p[i]
// ce incepe la pozitia j
D[i][j] = D[i-1][j];
if (j + p[i-1] <= n)
D[i][j] = min(D[i][j], D[i-1][j+p[i-1]]);
}
// calculam Log[i] = exponentul celei mai mare putere de 2 <= i
L[1] = 0;
for (i=2;i<=n;i++)
L[i] = 1 + L[i/2];
for (i=1;i<=m;i++) {
fin>>x>>y;
if (x > y) {
mySwap(x, y);
}
e = L[y-x+1];
fout<<min(D[e][x], D[e][y-p[e]+1])<<"\n";
}
return 0;
}