Cod sursa(job #2789126)

Utilizator RaresLiscanLiscan Rares RaresLiscan Data 26 octombrie 2021 22:07:01
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.97 kb
#include <bits/stdc++.h>

using namespace std;

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

int v[100000];
int M[100005][100];

void preprocessing(int n) {
    for (int i = 0; i < n; i ++) {
        M[i][0] = i;
    }

    for (int j = 1; 1 << j <= n; j ++) {
        for (int i = 0; i + (1 << j) <= n; i ++) {
            if (v[M[i][j-1]] < v[M[i + (1<<(j-1))][j-1]]) {
                M[i][j] = M[i][j-1];
            }
            else {
                M[i][j] = M[i + (1<<(j-1))][j-1];
            }
        }
    }
}

int findMinimum(int i, int j) {
    int k = floor(1.0 * log2((j - i + 1)));
    return min(v[M[i][k]], v[M[j - (1 << k) + 1][k]]);
}

int main()
{
    int n, m;
    fin >> n >> m;
    for (int i = 0; i < n; i ++) {
        fin >> v[i];
    }
    preprocessing(n);
    for (int p = 1; p <= m; p ++) {
        int i, j;
        fin >> i >> j;
        fout << findMinimum(i - 1, j - 1) << "\n";
    }
    return 0;
}