Cod sursa(job #2623650)

Utilizator raluca1234Tudor Raluca raluca1234 Data 3 iunie 2020 15:45:35
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <iostream>
#include <fstream>

const int MAX_N = 1e5 + 1;
const int MAX_LOG_N = 18;

int main()
{
    std::ifstream fin("rmq.in");
    std::ofstream fout("rmq.out");
    
    int n, m;
    fin >> n >> m;

    int arr[MAX_N];
    for (int i = 0; i < n; ++i) {
        fin >> arr[i];
    }

    int lg[MAX_N];
    lg[0] = lg[1] = 0;
    for (int number = 2; number <= n; ++number) {
        lg[number] = lg[number / 2] + 1;
    }

    int rmq[MAX_N][MAX_LOG_N];

    // initialize for the intervals with length 1
    for (int i = 0; i < n; ++i) {
        rmq[i][0] = i;
    } 
    // compute values from smaller to bigger intervals
    for (int j = 1; (1 << j) <= n; ++j) {
        for (int i = 0; i + (1 << j) - 1 < n; ++i) {
            if (arr[rmq[i][j - 1]] < arr[rmq[i + (1 << (j - 1))][j - 1]]) {
                rmq[i][j] = rmq[i][j - 1];
            } 
            else {
                rmq[i][j] = rmq[i + (1 << (j - 1))][j - 1];
            }
        }
    }

    while (m--) {
        int x, y;
        fin >> x >> y;
        x--; 
        y--;
 	
        int k = lg[y - x + 1];

        fout << std::min(arr[rmq[x][k]], arr[rmq[y - (1 << k) + 1][k]]) << '\n';
    }

    return 0;
}