Cod sursa(job #3134100)

Utilizator BranckhiusIon Dragos-Constantin Branckhius Data 28 mai 2023 14:44:51
Problema Range minimum query Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
#include <iostream>
#include <cmath>
#include <fstream>
using namespace std;

const int MAXN = 32000;
const int MAX = 10;

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

ifstream f("rmq.in");
ofstream g("rmq.out");

void readArray() {
    for (int i = 0; i < n; i++) {
        f >> 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] = 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 min(firstHalf, secondHalf);
}

int main() {
    int startIndex, endIndex;
    f >> n >> m;

    readArray();
    buildSegmentTree();

    for (int i = 0; i < m; i++) {
        f >> startIndex >> endIndex;
        startIndex--;
        endIndex--;
        g << query(startIndex, endIndex) << endl;
    }
    return 0;
}