Pagini recente » Cod sursa (job #2874917) | Cod sursa (job #266577) | Cod sursa (job #2599936) | Cod sursa (job #2663888) | Cod sursa (job #1903308)
#include <stdio.h>
namespace Var {
FILE *fin, *fout;
int N, M;
int *v, **m;
int *lg;
};
inline int mi(int x, int y) {
using namespace Var;
return (v[x] < v[y] ? x : y);
}
void citire() {
using namespace Var;
fscanf(fin, "%d%d", &N, &M);
v = new int[N];
for (int i = 0; i < N; ++i) {
fscanf(fin, "%d", v + i);
}
}
void pre_rmq() {
using namespace Var;
// Calculam logaritmii
lg = new int[N + 1];
lg[1] = 0;
for (int i = 2; i <= N; ++i) {
lg[i] = 1 + lg[i / 2];
}
// Facem matricea
m = new int*[lg[N] + 1];
for (int i = 0; i <= lg[N]; ++i) {
m[i] = new int[N];
}
for (int i = 0; i < N; ++i) {
m[0][i] = i;
}
for (int i = 1; i <= lg[N]; ++i) {
for (int j = 0; j < N; ++j) {
if (j + (1 << (i - 1)) < N) {
m[i][j] = mi(m[i-1][j], m[i-1][j + (1 << (i-1))]);
} else {
m[i][j] = m[i-1][j];
}
}
}
}
int rmq(int l, int r) {
using namespace Var;
return mi(m[lg[r - l + 1]][l], m[lg[r - l + 1]][r - (1 << lg[r - l + 1]) + 1]);
}
void afisare() {
using namespace Var;
for (int i = 0; i < M; ++i) {
int x, y;
fscanf(fin, "%d%d", &x, &y);
int loc = rmq(x - 1, y - 1);
fprintf(fout, "%d\n", v[loc]);
}
}
int main()
{
using namespace Var;
fin = fopen("rmq.in", "r");
fout = fopen("rmq.out", "w");
citire();
pre_rmq();
afisare();
fclose(fin);
fclose(fout);
return 0;
}