Cod sursa(job #1174539)

Utilizator andreiagAndrei Galusca andreiag Data 23 aprilie 2014 11:26:25
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[17][Nmax];

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[0][i] = A[i];
    
    for(int p = 1; p < 17; p++)
    for(int i = 0; i < N; i++)
    {
        B[p][i] = B[p-1][i];
        if (i+(1<<(p-1)) < N)
            B[p][i] = min(B[p][i], B[p-1][i+(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[p][a], B[p][b+1-(1<<p)]) << '\n';
    }

    return 0;
}