Cod sursa(job #1147656)

Utilizator ArmandNMArmand Nicolicioiu ArmandNM Data 20 martie 2014 00:26:43
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>

const int NMAX = 100003;
const int LOGN = 21;

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

int N,M,RMQ[NMAX][LOGN],A[NMAX],x,y,log,dpj,aux;

int minim(int a, int b)
{
    if (a < b) return a;
    return b;
}

int main()
{
    f >> N >> M;
    for (int i = 0; i < N; ++i)
    {
        f >> A[i];
    }

    for (int i = 0; i < N; ++i)
    {
        RMQ[i][0] = i;
    }

    for (int j = 1; (1<<j) <= N; ++j)
    {
        for (int i = 0; i + (1<<j) - 1 < N; ++i)
        {
            if (A[ RMQ[i][j-1] ] < A[ RMQ[i+(1<<(j-1))][j-1] ])
                RMQ[i][j] = RMQ[i][j-1];
            else RMQ[i][j] = RMQ[i+(1<<(j-1))][j-1];
        }
    }

    for (int i = 1; i <= M; ++i)
    {
        f >> x >> y;

        x--;
        y--;

        aux = y - x + 1;
        log = 0;
        while (aux > 1)
        {
            log++;
            aux /= 2;
        }
        if (aux == 0)
            log--;

        if (A[ RMQ[x][log] ] < A[ RMQ[y- (1<<log) + 1][log] ])
            g << A[ RMQ[x][log] ] << '\n';
        else g << A[ RMQ[y- (1<<log) + 1][log] ] << '\n';
    }
    f.close();
    g.close();
    return 0;
}