Pagini recente » Cod sursa (job #2935019) | Cod sursa (job #826575) | Cod sursa (job #1787774) | Cod sursa (job #874788) | Cod sursa (job #2758252)
#include <fstream>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int N, M, mat[20][300005];
int minQuery(int x, int y)
{
int lg = y - x + 1;
int pm = 1, ip = 0;
while (pm * 2 <= lg) {
pm *= 2; ip++;
} //caut cea mai mare putere a lui 2 mai mica decat lungimea intervalului
return min(mat[ip][x], mat[ip][y - pm + 1]); //intervalele se pot intrepatrunde pentru ca fac minimul si nu influenteaza
}
int main()
{
int x, y;
fin >> N >> M;
for (int i = 0; i < 17; ++i) //initializam cu valori care sa nu afecteze aflarea minimului
for (int j = 0; j < 300000; ++j) mat[i][j] = 100005;
for (int j = 0; j < N; ++j) fin >> mat[0][j]; //prima linie e vectorul
for (int i = 1, r = 2; r <= N; ++i, r *= 2) //r=2^i
//val[i][j]=minimul secventei pornind din pozitia j si avand o lungime de 2^i numere
for (int j = 0; j < N; ++j) mat[i][j] = min(mat[i - 1][j], mat[i - 1][j + r / 2]);
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;
}