Pagini recente » Cod sursa (job #2678793) | Cod sursa (job #728755) | Cod sursa (job #1978371) | Cod sursa (job #3245013) | Cod sursa (job #3133910)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
const int NMAX = 100002, LMAX = 18;
int vector[NMAX], logaritmi[NMAX], rmq[LMAX][NMAX];
int x, y, maxIndex, stanga, dreaptaIndex, dreapta, diferenta, logDiferenta, r, valoareStanga, valoareDreapta, minim;
int main()
{
int N, M;
f >> N >> M;
f >> vector[1];
rmq[0][1] = vector[1];
for (int i = 2; i <= N; i++)
{
f >> vector[i];
logaritmi[i] = logaritmi[i / 2] + 1;
rmq[0][i] = vector[i];
}
for (int i = 1; (1 << i) <= N; i++)
{
maxIndex = N - (1 << i) + 1;
for (int j = 1; j <= maxIndex; j++)
{
stanga = rmq[i - 1][j];
dreaptaIndex = j + (1 << (i - 1));
dreapta = rmq[i - 1][dreaptaIndex];
minim = min(stanga, dreapta);
rmq[i][j] = minim;
}
}
while (M--)
{
f >> x >> y;
diferenta = y - x + 1;
logDiferenta = logaritmi[diferenta];
r = y - (1 << logDiferenta) + 1;
valoareStanga = rmq[logDiferenta][x];
valoareDreapta = rmq[logDiferenta][r];
minim = min(valoareStanga, valoareDreapta);
g << minim << '\n';
}
return 0;
}