Cod sursa(job #2904685)

Utilizator Iolanda08Iolanda Caliman Iolanda08 Data 18 mai 2022 00:37:16
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 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;
}