Cod sursa(job #2754739)

Utilizator bianca_voicuBianca Voicu bianca_voicu Data 26 mai 2021 14:08:42
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;

// Idea from sparse tree https://www.topcoder.com/thrive/articles/Range%20Minimum%20Query%20and%20Lowest%20Common%20Ancestor

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

int N, M, ST[100000][18], A[100000];

int main() {
    std::ios::sync_with_stdio(false);
    f >> N >> M;
    for (int i = 0; i < N; i++) {
        ST[i][0] = i;
        f >> A[i];
    }

    for (int j = 1; (1 << j) <= N; j++) {
        for (int i = 0; i + (1 << j) - 1 < N; i++)
            ST[i][j] = (A[ST[i][j - 1]] < A[ST[i + (1 << (j - 1))][j - 1]]) ?
                       ST[i][j - 1] : ST[i + (1 << (j - 1))][j - 1];
    }

    /** for (int j = 0; (1 << j) <= N; j++) {
        for (int i = 0; i + (1 << j) - 1 < N; i++)
            cout << ST[i][j] << ' ';
        cout << '\n';
    } */

    for (int i, j; f >> i >> j;) {
        i--, j--;
        int k = log2(j - i + 1);
        g << min(A[ST[i][k]], A[ST[j - (1 << k) + 1][k]]) << '\n';
    }
    return 0;
}