Cod sursa(job #1834108)

Utilizator ArmandNMArmand Nicolicioiu ArmandNM Data 23 decembrie 2016 21:38:14
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <fstream>

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

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

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

void RMQ()
{
    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];
        }
    }
}

int logaritm(int x)
{
    int ans = 0;
    while (x > 1)
    {
        ans++;
        x /= 2;
    }
    return ans;
}

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

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

    RMQ();

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

        Lg = logaritm(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;
}