Cod sursa(job #3133910)

Utilizator daria_lapadusLapadus Daria daria_lapadus Data 27 mai 2023 14:07:18
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <iostream>
#include <fstream>
using namespace std;

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

const int NMAX = 100002, LMAX = 18;
int vector[NMAX], logaritmi[NMAX], rmq[LMAX][NMAX];
int x, y, maxIndex, stanga, dreaptaIndex, dreapta, diferenta, logDiferenta, r, valoareStanga, valoareDreapta, minim;

int main()
{
    int N, M;
    f >> N >> M;
    f >> vector[1];
    rmq[0][1] = vector[1];
    for (int i = 2; i <= N; i++)
    {
        f >> vector[i];
        logaritmi[i] = logaritmi[i / 2] + 1;
        rmq[0][i] = vector[i];
    }
    for (int i = 1; (1 << i) <= N; i++)
    {
        maxIndex = N - (1 << i) + 1;
        for (int j = 1; j <= maxIndex; j++)
        {
            stanga = rmq[i - 1][j];
            dreaptaIndex = j + (1 << (i - 1));
            dreapta = rmq[i - 1][dreaptaIndex];
            minim = min(stanga, dreapta);
            rmq[i][j] = minim;

        }
    }
    while (M--)
    {
        f >> x >> y;
        diferenta = y - x + 1;
        logDiferenta = logaritmi[diferenta];
        r = y - (1 << logDiferenta) + 1;
        valoareStanga = rmq[logDiferenta][x];
        valoareDreapta = rmq[logDiferenta][r];
        minim = min(valoareStanga, valoareDreapta);
        g << minim << '\n';

    }
    return 0;
}