Cod sursa(job #593824)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 4 iunie 2011 16:45:43
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <iostream>
#include <fstream>

using namespace std;

long N, M, Log2[100010], X[100010], QA, QB, RMQ[20][100010];

inline long Min (long a, long b)
{
    if (a>b)
    {
        return b;
    }
    return a;
}

long Putere (long n)
{
    return (1<<n);
}

void BuildRMQ ()
{
    long i, j;
    for (j=1; j<=N; j++)
    {
        RMQ[0][j]=X[j];
    }
    for (i=1; i<=Log2[N]; i++)
    {
        for (j=1; j<=N; j++)
        {
            RMQ[i][j]=Min (RMQ[i-1][j], RMQ[i-1][j+Putere(i-1)]);
        }
    }
}

int main()
{
    ifstream fin ("rmq.in");
    ofstream fout ("rmq.out");
    long i, j, L;
    fin >> N >> M;
    for (i=1; i<=N; i++)
    {
        Log2[i]=Log2[i/2]+1;
        Log2[1]=0;
        fin >> X[i];
    }
    BuildRMQ ();
    for (; M>0; M--)
    {
        fin >> QA >> QB;
        L=QB-QA+1;
        fout << Min (RMQ[Log2[L]][QA], RMQ[Log2[L]][QA+L-Putere(Log2[L])]) << "\n";
    }
    fin.close ();
    fout.close ();
    return 0;
}