Cod sursa(job #2752305)

Utilizator DianaIfrosaIfrosa Diana DianaIfrosa Data 17 mai 2021 17:20:08
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");

int n,m;
int val[18][300003];

void Init()
{
    for(int i=0; i<17; ++i)
        for(int j=0; j<300000; ++j)
            val[i][j]=100005; //o valoare foarte mare nu va influenta minimul

}

void Prep()
{
    //val[i][j]=minimul secventei pornind din pozitia j si avand o lungime de 2^i numere
    for(int i=1, range=2; range<=n; ++i, range*=2) //range=2^i
        for(int j=0; j<n; ++j)
            val[i][j]=min(val[i-1][j], val[i-1][j+range/2]);

}

int minQuery(int x, int y)
{
    int len=y-x+1;
    int powmax=1, indexpow=0;

    //caut cea mai mare putere a lui 2 mai mica decat lungimea intervalului
    while(powmax*2<=len)
        powmax*=2, indexpow++;

    //intervalele se pot intrepatrunde pentru ca fac minimul si nu influenteaza
    return min(val[indexpow][x], val[indexpow][y-powmax+1]);

}
int main()
{
    int x,y;
    fin>>n>>m;
    Init();
    for(int j=0; j<n; ++j)
        fin>>val[0][j]; //prima linie e vectorul

    Prep(); //preprocesare

    for(int i=1;i<=m;++i)
    {
        fin>>x>>y; //capetele intervalului
        fout<<minQuery(x,y)<<"\n"; //indexare de la 0 in matricea mea
    }

    return 0;
}