Cod sursa(job #3134188)

Utilizator Andrei20035Rusu Andrei Andrei20035 Data 28 mai 2023 18:11:57
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <iostream>
#include <cmath>
#include <fstream>

const int MAXN = 100000;
const int MAX = 20;

int rmq[MAXN][MAX];
int n, m;

void readArray(std::ifstream& fin) {
    for (int i = 0; i < n; i++) {
        fin >> rmq[i][0];
    }
}

void buildSegmentTree() {
    for (int j = 1; pow(2, j) <= n; j++) {
        for (int i = 0; i + pow(2, j) <= n; i++) {
            int firstHalf = rmq[i][j - 1];
            int secondHalf = rmq[i + (int)pow(2, j - 1)][j - 1];
            rmq[i][j] = std::min(firstHalf, secondHalf);
        }
    }
}

int query(int f, int l) {
    int len = l - f + 1;
    int k = (int)log2(len);
    int firstHalf = rmq[f][k];
    int secondHalf = rmq[l - (int)pow(2, k) + 1][k];
    return std::min(firstHalf, secondHalf);
}

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

    fin >> n >> m;

    readArray(fin);
    buildSegmentTree();

    for (int i = 0; i < m; i++) {
        int startIndex, endIndex;
        fin >> startIndex >> endIndex;
        startIndex--;
        endIndex--;
        fout << query(startIndex, endIndex) << std::endl;
    }

    fin.close();
    fout.close();

    return 0;
}