Cod sursa(job #2629629)

Utilizator minecraft3Vintila Valentin Ioan minecraft3 Data 21 iunie 2020 21:37:48
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.76 kb
#include <bits/stdc++.h>
using namespace std;

#define K 18
#define N 100005

ifstream fin("rmq.in");
ofstream fout("rmq.out");

int n, a[K][N], logTable[N];

void precompute() {
    for(int i = 1; (1 << i) <= n; ++i)
        for(int j = 0; j + (1 << i) <= n; ++j)
            a[i][j] = min(a[i-1][j],
                          a[i-1][j + (1 << (i-1))]);
    
    logTable[2] = 1;
    for(int i = 3; i < N; ++i)
        logTable[i] = logTable[i/2] + 1;
}

int rmq(int x, int y) {
    int& i = logTable[y-x+1];
    return min(a[i][x], a[i][y - (1<<i) + 1]);
}

int main() {
    int m, x, y;
    fin >> n >> m;
    for(int i = 0; i < n; ++i)
        fin >> a[0][i];
    
    precompute();
    do { 
        fin >> x >> y;
        fout << rmq(x-1, y-1) << '\n';
    } while(--m);
}