Cod sursa(job #3274605)

Utilizator gabi45235Gabi FARCAS gabi45235 Data 7 februarie 2025 16:02:57
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>

const int MAXN = 100000;
const int LOG = 17; // log2(100000) ≈ 16.6

int table[MAXN][LOG];
int logTable[MAXN + 1];

void buildSparseTable(const std::vector<int> &nums, int N)
{
    for (int i = 0; i < N; i++)
    {
        table[i][0] = nums[i];
    }

    for (int j = 1; (1 << j) <= N; j++)
    {
        for (int i = 0; (i + (1 << j) - 1) < N; i++)
        {
            table[i][j] = std::min(table[i][j - 1], table[i + (1 << (j - 1))][j - 1]);
        }
    }

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

int query(int L, int R)
{
    int j = logTable[R - L + 1];
    return std::min(table[L][j], table[R - (1 << j) + 1][j]);
}

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

    int N, M;
    fin >> N >> M;

    std::vector<int> nums(N);
    for (int i = 0; i < N; i++)
    {
        fin >> nums[i];
    }

    buildSparseTable(nums, N);

    for (int i = 0; i < M; i++)
    {
        int x, y;
        fin >> x >> y;
        fout << query(x - 1, y - 1) << "\n";
    }

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

    return 0;
}