Cod sursa(job #1393718)

Utilizator Arodoet96Teodora Stoleru Arodoet96 Data 19 martie 2015 18:38:24
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <fstream>
#define DMAX 100004

using namespace std;

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

int n, m;
int A[DMAX], log[DMAX];
int rmq[DMAX][20];

void citire();
void RMQ();
void logaritm();
void query();

int main()
{
    citire();
    RMQ();
    logaritm();
    query();
    return 0;
}

void citire()
{
    int i;
    fin>>n>>m;
    for(i=1;i<=n;++i)
    {
        fin>>A[i];
        rmq[i][0]=A[i];
    }
}

void RMQ()
{
    int i, j, L;
    for(j=1;(1<<j)<=n;++j)
        for(i=1;i<=n-(1<<j)+1;++i)
        {
            L=(1<<(j-1));
            rmq[i][j]=min(rmq[i][j-1], rmq[i+L][j-1]);
        }
}

void logaritm()
{
    int i;
    for(i=2;i<=n;++i)
        log[i]=log[i/2]+1;
}

void query()
{
    int i, x, y, aux, dif, L, l;
    for(i=1;i<=m;++i)
    {
        fin>>x>>y;
        if(y<x) { aux=x; x=y; y=aux; }

        dif=y-x+1;
        L=log[dif];
        l=dif-(1<<L);

        fout<<min(rmq[x][L], rmq[x+l][L])<<'\n';
    }
}