Pagini recente » Cod sursa (job #2495267) | Cod sursa (job #1898588) | Cod sursa (job #3256912) | Cod sursa (job #864317) | Cod sursa (job #403711)
Cod sursa(job #403711)
#include <fstream>
#define NMAX 100000
#define LGMAX 20
#define INFI 200000
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int N, M, Min[LGMAX][NMAX], lg[NMAX], A[NMAX];
inline int minim(int a, int b)
{
if (a < b) return a;
return b;
}
void Citire(void)
{
int i;
fin >>N >>M;
for (i = 1; i <= N; i++)
fin >>A[i];
}
void GenereazaMin(void)
{
int i, j;
//Intai preprocesam logaritmii
for (i = 2; i <= N; i++)
lg[i] = lg[i / 2] + 1;
//Acum Generam Matricea R
for (i = 1; i <= N; i++)
Min[0][i] = A[i];
for (i = 1; i <= N; i++)
for (j = 1; j <= lg[N]; j++)
Min[j][i] = INFI;
for (j = 1; (1 << j) <= N; j++)
for (i = 1; i + (1 << j) - 1 <= N; i++)
{
Min[j][i] = minim(Min[j-1][i], Min[j-1][i + (1 << (j - 1))]);
}
}
void Rezolva()
{
int s, d, i;
for (i = 1; i <= M; i++)
{
fin >>s >>d;
fout << minim(Min[lg[d- s + 1]][s] ,Min[lg[d- s +1]][d + 1 - (1 << lg[d-s+1])]) <<'\n';
}
fin.close();
fout.close();
}
int main()
{
Citire();
GenereazaMin();
Rezolva();
return 0;
}