Pagini recente » Cod sursa (job #2278624) | Cod sursa (job #1255904) | Cod sursa (job #1232848) | Cod sursa (job #2765371) | Cod sursa (job #2905095)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int n, m;
int v[18][300003];
void Initializare() //initializam cu valori care sa nu afecteze aflarea minimului
{
for (int i = 0; i < 17; ++i)
for (int j = 0; j < 300000; ++j) v[i][j] = 100005;
}
//v[i][j]=minimul secventei pornind din pozitia j si avand o lungime de 2^i numere
void Preprocesare()
{
for (int i = 1, range = 2; range <= n; ++i, range *= 2) //range=2^i
for (int j = 0; j < n; ++j) v[i][j] = min(v[i - 1][j], v[i - 1][j + range / 2]);
}
int minQuery(int x, int y)
{
int len = y - x + 1;
int powmax = 1, indexpow = 0;
while (powmax * 2 <= len) powmax *= 2, indexpow++; //caut cea mai mare putere a lui 2 mai mica decat lungimea intervalului
return min(v[indexpow][x], v[indexpow][y - powmax + 1]); //intervalele se pot intrepatrunde pentru ca fac minimul si nu influenteaza
}
int main()
{
int x, y;
fin >> n >> m;
Initializare();
for (int j = 0; j < n; ++j) fin >> v[0][j]; //prima linie e vectorul
Preprocesare();
for (int i = 1; i <= m; ++i)
{
fin >> x >> y; //capetele intervalului
fout << minQuery(x - 1, y - 1) << "\n"; //indexare de la 0 in matricea mea
}
return 0;
}