Cod sursa(job #2905095)

Utilizator pasare.franci@yahoo.comPasare Francisca [email protected] Data 19 mai 2022 15:57:33
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#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;
}