Cod sursa(job #1174537)

Utilizator andreiagAndrei Galusca andreiag Data 23 aprilie 2014 11:11:03
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.78 kb
#include <fstream>
#include <math.h>

using namespace std;

const int Nmax = 100005;
int A[Nmax];
int B[Nmax][17];

inline int min(int x, int y) { return x < y ? x : y; }

int main()
{
    ifstream f ("rmq.in");
    ofstream g ("rmq.out");
    int N,M;

    f >> N >> M;
    for (int i = 0; i < N; i++)
    {
        f >> A[i];
    }
    for(int i = 0; i < N; i++)
        B[i][0] = A[i];
    
    for(int p = 1; p < 17; p++)
    for(int i = 0; i < N; i++)
    {
        B[i][p] = B[i][p-1];
        if (i+(1<<(p-1)) < N)
            B[i][p] = min(B[i][p], B[i+(1<<(p-1))][p-1]);
    }
    
    int a, b;
    for (int i = 0; i < M; i++)
    {
        f >> a >> b;
        a--; b--;
        int p = floor(log2(b-a+1));
        g << min(B[a][p], B[b+1-(1<<p)][p]) << '\n';
    }

    return 0;
}