Cod sursa(job #1685831)

Utilizator llalexandruLungu Alexandru Ioan llalexandru Data 11 aprilie 2016 21:16:48
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <fstream>
#include <cmath>
#define NM 100005

using namespace std;

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

int n, m, k, A[NM], M[NM][20];

void Preprocesare()
{
    int i, j, loc;

    for (i=1; i<=n; i++)
    {
        M[i][0]=i;
    }
    loc=1;
    for (i=1; i<=k; i++)
    {
        for (j=1; j<=n; j++)
        {
            if (A[M[j][i-1]]<A[M[j+loc][i-1]])
                M[j][i]=M[j][i-1];
            else
                M[j][i]=M[j+loc][i-1];
        }
        loc *= 2;
    }
}

void RMQ()
{
    int i, x, y, d;
    for (i=1; i<=m; i++)
    {
        fin>>x>>y;
        d=(log(y-x+1)/log(2));
        if (A[M[x][d]]>A[M[y-d][d]])
            fout<<A[M[y-d][d]]<<'\n';
        else
            fout<<A[M[x][d]]<<'\n';
    }
}

int main()
{
    int i, j;
    fin>>n>>m;
    for (i=1; i<=n; i++)
    {
        fin>>A[i];
    }
    k=log(n)/log(2);
    Preprocesare();
    RMQ();
    return 0;
}