Cod sursa(job #737675)

Utilizator gener.omerGener Omer gener.omer Data 19 aprilie 2012 23:36:22
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

#define NMAX    100005
#define LOGNMAX 20

int A[NMAX], N, M;
int P[NMAX][LOGNMAX];

void preprocess(){
    for(int i = 0; i < N; ++i)
        P[i][0] = A[i];
    for(int j = 1; (1<<j) <= N; ++j)
        for(int i = 0; (i + 1 << j - 1) < N; ++i)
        {
            P[i][j] = min(P[i][j-1], P[i + 1 << (j - 1)][j-1]);
        }
}

int solve(int x, int y){
    int z = y - x + 1, log;
    for(log = 0; (1<<log) <= z; ++log);
    --log;
    return min(P[x][log], P[y-(1<<log)+1][log]);
}

int main(){
    ifstream in ("rmq.in");
    ofstream out("rmq.out");
    in >> N >> M;
    for(int i = 0; i < N; ++i)
        in >> A[i];
    preprocess();
    for(int i = 0; i < M; ++i){
        int x, y;
        in >> x >> y;
        int ret = solve(x-1, y-1);
        out << ret << endl;
    }
    return 0;
}