Cod sursa(job #1164233)

Utilizator SRaduRadu Szasz SRadu Data 1 aprilie 2014 22:46:16
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <fstream>

using namespace std;

const int MAX = 100101;
const int LGMAX = 17;

int N, M, log[MAX];
int RMQ[LGMAX][MAX];

int main() {
    ifstream in("rmq.in");
    in >> N >> M;
    
    for(int i = 1, A; i <= N; i++) {
        in >> A;
        RMQ[0][i] = A;
    }
    
    log[1] = 0;
    for(int i = 2; i <= N; i++)
        log[i] = log[i >> 1] + 1;

    for(int lvl = 1; lvl <= log[N]; lvl++)
        for(int i = 1; i <= N - (1 << lvl) + 1; i++)
            RMQ[lvl][i] = min(RMQ[lvl - 1][i], RMQ[lvl - 1][i + (1 << (lvl - 1))]);

    ofstream out("rmq.out"); 
    for(int i = 0; i <= log[N]; i++) {
        for(int j = 1; j <= N; j++)
            out << RMQ[i][j] << " ";
        out << "\n";
    }

    for(int i = 1, A, B, diff; i <= M; i++) {
        in >> A >> B;
        diff = B - A + 1;

        out << min(RMQ[ log[diff] ][A], RMQ[ log[diff] ][ B - (1 << log[diff]) + 1 ]) << "\n";
    } in.close(); out.close();
}