Cod sursa(job #2322554)

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


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

int n,nrteste,log[21],sir[100006],rmq[100006][21],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=0; i<=log[n]+1; i++)
    {
        for(int j=1; j<=n; j++)
            fo<<rmq[i][j]<<" ";
        fo<<endl;
    }

    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;
}