Cod sursa(job #1092663)

Utilizator CosminRusuCosmin Rusu CosminRusu Data 27 ianuarie 2014 12:13:11
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <fstream>
#include <iostream>

using namespace std;

const int MAXN = 100005;
const int MAXLG = 20;

int N, M, RMQ[MAXLG][MAXN], lg[MAXN], A[MAXN];

int main() {
    ifstream fin("rmq.in");
    ofstream fout("rmq.out");
    fin >> N >> M;
    for(int i = 1 ; i <= N ; ++ i)
        fin >> A[i];
    for(int i = 2 ; i <= N ; ++ i)
        lg[i] = lg[i >> 1] + 1;
    for(int i = 1 ; i <= N ; ++ i)
        RMQ[0][i] = i;
    for(int i = 1 ; (1 << i) <= N ; ++ i)
        for(int j = 1 ; j + (1 << i) - 1 <= N ; ++ j) {
            int l = 1 << (i - 1);
            RMQ[i][j] = RMQ[i-1][j];
            if(A[RMQ[i][j]] > A[RMQ[i - 1][j + l]])
                RMQ[i][j] = RMQ[i - 1][j + l];
        }
    for(int i = 1 ; i <= M ; ++ i) {
        int x, y;
        fin >> x >> y;
        int LG = lg[x - y + 1];
        int Ans = RMQ[LG][x];
        if(A[Ans] > A[RMQ[LG][y - (1 << LG) + 1]])
            Ans = RMQ[LG][y  - (1 << LG) + 1];
        fout << A[Ans] << '\n';
    }
    return 0;
}