Cod sursa(job #3235466)

Utilizator PetstebPopa Petru Petsteb Data 18 iunie 2024 00:34:16
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
// solutie MadaliIoana
#include <fstream>

const int MAX_N = 100'005;
const int LOG = 17;
int a[MAX_N];
int m[MAX_N][LOG]; // m[i][j] is minimum among a[i..i+2^j-1]
int bin_log[MAX_N];

int query(int L, int R)
{ // O(1)
    int length = R - L + 1;
    int k = bin_log[length];
    return std::min(m[L][k], m[R - (1 << k) + 1][k]);
}

int main()
{

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

    // 1) read input
    int M, N;
    fin >> M >> N;

    bin_log[1] = 0;
    for (int i = 2; i <= M; i++)
    {
        bin_log[i] = bin_log[i / 2] + 1;
    }

    for (int i = 0; i < M; i++)
    {
        fin >> a[i];
        m[i][0] = a[i];
    }

    // 2) preprocessing, O(N*log(N))
    for (int k = 1; k < LOG; k++)
    {
        for (int i = 0; i + (1 << k) - 1 < M; i++)
        {
            m[i][k] = std::min(m[i][k - 1], m[i + (1 << (k - 1))][k - 1]);
        }
    }
    // 3) answer queries
    for (int i = 0; i < N; i++)
    {
        int l, r;
        fin >> l >> r;
        l -= 1;
        r -= 1;
        fout << query(l, r) << "\n";
    }

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

    return 0;
}