Cod sursa(job #738575)

Utilizator gener.omerGener Omer gener.omer Data 20 aprilie 2012 22:57:53
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cstdio>


using namespace std;
#define NMAX 100005
#define LOGNMAX 20

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

void preprocess(){
    for(int i = 0; i < N; ++i)
        P[i][0] = A[i];
    for(int j = 1; j < LOGNMAX; ++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);
    if(log > 0) --log;

    return min(P[x][log], P[y - (1<<log) + 1][log]);
}

int main(){
    //ifstream in  ("rmq.in");
    //ofstream out ("rmq.out");
    freopen("rmq.in", "rt", stdin);
    freopen("rmq.out", "wt", stdout);
    //in >> N >> M;
    scanf("%d %d", &N, &M);
    for(int i = 0; i < N; ++i)
        //in >> A[i];
        scanf("%d", &A[i]);
    preprocess();
    for(int i = 0; i < M; ++i){
        int x, y;
        //in >> x >> y;
        scanf("%d %d", &x, &y);
        int ret = solve(x-1, y-1);
        //out << ret << endl;
        printf("%d\n", ret);
    }
    return 0;
}