Cod sursa(job #1834139)

Utilizator ArmandNMArmand Nicolicioiu ArmandNM Data 23 decembrie 2016 22:40:36
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <fstream>

const int NMAX = 100005;
const int LGMAX = 21;

using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");

int n,q,m,A[NMAX],M[NMAX][LGMAX],x,y,dif,Log[NMAX];

void preprocess()
{
    for (int i = 1; i <= n; ++i)
    {
        M[i][0] = i;
    }

    for (int j = 1; (1<<j) <= n; ++j)
    {
        for (int i = 1; i+(1<<j)-1 <= n; ++i)
        {
            if (A[ M[i][j-1] ] < A[ M[i + (1<<(j-1))][j-1] ])
                M[i][j] = M[i][j-1];
            else M[i][j] = M[i + (1<<(j-1))][j-1];
        }
    }
}

void logaritmi()
{
    Log[1] = 0;
    for (int i = 2; i <= n; ++i)  //precalculare Logaritmi
    {
        Log[i]=Log[i/2]+1;
    }
}

int main()
{
    f >> n >> q;

    for (int i = 1; i <= n; ++i)
    {
        f >> A[i];
    }

    logaritmi();
    preprocess();

    for (int i = 1; i <= q; ++i)
    {
        f >> x >> y;
        dif = y - x + 1;

        int Lg = Log[dif];

        if (A[ M[x][Lg] ] < A[ M[y-(1<<Lg)+1][Lg] ])
            g << A[ M[x][Lg] ] << '\n';
        else g << A[ M[y-(1<<Lg)+1][Lg] ] << '\n';
    }

    f.close();
    g.close();
    return 0;
}