Pagini recente » Cod sursa (job #2805697) | Rating Bona si Iovanesc (bonasiiovanesc) | Cod sursa (job #2257027) | Cod sursa (job #997166) | Cod sursa (job #2761225)
#include <fstream>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int N, M;
int m[505][500005];
int query(int a, int b)
{
int L = b - a + 1;
int putere = 1, ct = 0;
//cautam cea mai mare putere a lui 2 mai mica decat lungimea intervalului
while (putere * 2 <= L) putere *= 2, ct++;
if (m[ct][a] < m[ct][b - putere + 1]) return m[ct][a];
return m[ct][b - putere + 1];
}
void Initializare()
{
//100005 nu infl afl min
for (int i = 0; i < 505; ++i)
for (int j = 0; j < 500005; ++j) m[i][j] = 100005;
}
void Citire()
{
fin >> N >> M;
//prima linie a matr e vectorul
for (int i = 0; i < N; ++i) fin >> m[0][i];
}
void contMatr()
{
//l=2^i
int i = 1;
for (int l = 2; l <= N; l *= 2)
//val[i][j] = minimul secventei pornind din pozitia j si avand o lungime de 2^i numere
{
for (int j = 0; j < N; ++j)
if (m[i - 1][j] < m[i - 1][j + l / 2])
m[i][j] = m[i - 1][j];
else
m[i][j] = m[i - 1][j + l / 2];
++i;
}
}
void Rezolvare()
{
int a, b;
for (int i = 1; i <= M; ++i)
{
// capetele intervalului
fin >> a >> b;
//m indexata de la 0
fout << query(a - 1, b - 1) << "\n";
}
}
int main()
{
Initializare();
Citire();
contMatr();
Rezolvare();
return 0;
}