Cod sursa(job #2607338)

Utilizator minecraft3Vintila Valentin Ioan minecraft3 Data 29 aprilie 2020 17:05:33
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.79 kb
#include <bits/stdc++.h>

using namespace std;

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

#define N 100005
#define L 17

int v[N], n;
int M[L][N], L2[N];

void precalc() {
    M[0][1] = v[1]; L2[1] = 0;
    for(int i = 2; i <= n; ++i) {
        M[0][i] = v[i];
        L2[i] = 1+L2[i/2];
    }
    for(int j = 1; j <= n; ++j) {
        for(int i = 1; (1 << i) <= j; ++i) {
            int j_prim = j - (1 << (i-1));
            M[i][j] = min(M[i-1][j_prim], M[i-1][j]);
        }
    }
}

int rmq(int x, int y) {
    const int l = L2[y-x+1];
    return min(M[l][x+(1<<l)-1], M[l][y]);
}

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