Cod sursa(job #2322559)

Utilizator marcogoldPop Mihali Marco Silviu marcogold Data 17 ianuarie 2019 21:29:35
Problema Range minimum query Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.97 kb
#include <iostream>
#include <fstream>
using namespace std;


ofstream fo("rmq.out");
ifstream fi("rmq.in");

int n,nrteste,log[21],sir[100006],rmq[21][100006],inceput,sfarsit;
///linie-> puteri de 2
///coloana-> numerele

int main()
{
    for(int i=2; i<=21; i++)
        log[i]=log[i/2]+1;

    fi>>n>>nrteste;

    for(int i=1; i<=n; i++)
    {
        fi>>sir[i];
        rmq[0][i]=i;
    }

    for(int i=1; i<=log[n]+1; i++) ///puteri
        for(int j=1; j<=(n-(1<<i)+1 ); j++) ///elem
            if(sir[ rmq[i-1][j] ] <sir[ rmq[i-1][j+(1<<(i-1))] ]  )
                rmq[i][j]=rmq[i-1][j];
            else
                rmq[i][j]=rmq[i-1][j+(1<<(i-1))];


    for(int i=1; i<=nrteste; i++)
    {
        fi>>inceput>>sfarsit;
        int lungime=sfarsit-inceput+1,lg;
        lg=log[lungime];

        fo<<min( sir[rmq[lg][inceput]], sir[rmq[lg][sfarsit-(1<<lg)+1]] )<<'\n';
    }

    fi.close();
    fo.close();
    return 0;
}